目錄
傳統版本
題目描述
傳統思路
傳統代碼
封神版本
兩行代碼
二次改進
三次改進
代碼分析
列表推導式
str()函數
str.join()函數
str.strip()函數
str.count()函數
試計算在區間 1 到 n 的所有整數中,數字 x(0 ≤ x ≤ 9)共出現了多少次?例如,在 1到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,數字 1 出現了 4 次。
輸入輸出格式
輸入格式:
輸入共 1 行,包含 2 個整數 n、x,之間用一個空格隔開。
輸出格式:
輸出共 1 行,包含一個整數,表示 x 出現的次數。
輸入輸出樣例
輸入樣例#1:
11 1
輸出樣例#1:
4
對於每一個數,我們首先將它按位數劃分出來,提取它的各個位數,一一比對就行。
具體操作就是:兩個循環,外循環實現從1到n的所有整數,內循環實現每一個整數的各位上的數字比對,采用和10取余的方式取出它的各位,一次和10取余可以取出個位上的數字,之後讓其除以10,就可以把十位上的數字拉到各位,如此反復直到它為0.
要注意Python中的 / 不只是整除,python不是靜態類型語言,數據類型是在程序執行過程中確定的,所以我們需要把結果強制轉換成整型來操作。
m,n=map(int,input().split())
count=0
for i in range(1,m+1):
temp=i
while temp:
if temp%10==n:
count=count+1
temp=int(temp/10)
print(count)
n,x=map(int,input().split())
print((("".join([str(i) for i in range(0,n+1)])).strip()).count(str(x),0))
n,x=map(int,input().split())
print(str([i for i in range(n+1)]).strip().count(str(x),0))
n,x=map(int,input().split())
print(str([i for i in range(n+1)]).count(str(x)))
重要的不是只有兩行代碼,重要的是,這兩行代碼是怎麼寫出來的。
為了方便大家閱讀以及我個人講解,我采用高一學習復雜英語句子的方式來給大家剝蠶抽絲。
首先劃分結構,為了方便理解,我把這兩行代碼拆開成下面這個模樣:
n,x=map(int,input().split())
a=[str(i) for i in range(0,n+1)]
b=("".join(a))
c=(b.strip())
d=c.count(str(x),0) print(d)
然後是逐個知識點分析,個人感覺學Python就是學它的各種庫函數的過程。
首先是列表推導式
列表推導式簡單的來說,就是用簡潔的代碼快速創建出列表的方式,如果你不知道什麼是列表,請看淺談Python列表及其增刪改查_^o^葉子^0^的博客-CSDN博客_python列表的增刪改查
好了,舉個列表推導式的使用例子:
比如說我們想創建一個列表[0,1,2,3,4,5,6,7,8,9],常規的操作是這樣的:
a=[]
for i in range(10): a.append(i)
print(a)
但是使用列表推導式可以一行代碼搞定:
print([i for i in range(10)])
當然,列表推導式知識博大精深,遠遠不止這些東西,但是和我們這裡的計數問題相關不大,有機會再聊,而且隨著Python的發展,也出現了與之對應的字典推導式和集合推導式,這裡不多說。我們進入下一個知識點,str()函數。
這個就很簡單了,它就是,把括號裡面東西的變成字符(串),像我們代碼中的
[str(i) for i in range(0,n+1)]
就是創建0到n的一堆數字字符,那為什麼要字符類型的呢?因為後面會解釋到^_^。
好了,我們進入下一個內容,str.join()函數
對於一些很簡單的事情,我們往往不解釋而直接給出結果:
print('^_^'.join('000000000'))
再看:
print('¥'.join('我並不知道要做什麼'))
其實就是將後面的以前面的作為間隔分開再拼成字符串。
對於列表、字典、集合也適用:
print(' '.join(['I','love','you','!']))
我們代碼中的"".join()就是不間隔開直接拼起來。
咦,好像也不需要用到join,我為啥不直接用str()轉字符串呢?
好了,經實踐表明,這個也可以實現:
n,x=map(int,input().split())
print(str([i for i in range(n+1)]).strip().count(str(x),0))
我……,這個看起來還簡單一點,我真是服了T_T……
好了,來到str.strip()函數
這個函數就是去掉首尾指定的字符,嗯……嗯!!!
但是好像在這裡沒用啊T_T……
這一天天的,我在干什麼!
好了,來到我們文章的末尾的count函數
這個函數就很優秀了,它可以用來統計字符串裡面某個字符(串)出現的次數。
比如:count('X',3,7)就可以統計從第四個字符到第8個字符之間X出現的次數。
完事,再修改一下下,完美。