劍指offer 最快找出整數中1出現的次數

2021-10-01 12:59:59 字數 1370 閱讀 6463

本文使用python實現

求1~1300的整數中1出現的次數?比如1,10,11,12,13這5個數字中1出現了6次。

時間限制:1s;空間限制:32768k

方法一:暴力解法(當數字較小時可以,數字很大時不可取)

方法二:觀察規律(在此我們將題目拓展成整數中 x 出現的次數, x∈ )

(1)在 [1,10] 中 ,個位上 x 出現的次數為 1 。

(2)在 [11,100] 中,十位上 x 出現的次數為 10 。

(3)在 [101,1000] 中,百位上 x 出現的次數為 100 。

(4)以此類推,在 [10i+1,10(i+1)] 上,從右數第 i 位上 x 出現的次數為 10(i−1) 。

而 [1,n] 中第 i 位上 x 出現的次數規律為:

(a)當第 i 位的數字 >x 時,[1,n] 中第 i 位上為 x 的個數為:(n//10i+1)∗10(i−1)

(b)當第 i 位的數字 5 ,故對照規律(a): (2593//102+1)×10(2−1)=260 ,也就是說,在 [0 2593] 中 5 在十位上出現了 260 次。

(3)百位(從右至左第3位):由於百位上的數字 5=5 ,故對照規律(c): (2593//103)∗10(3−1)+(2593取模103−5∗10(3−1)+1)=294 ,也就是說,在 [0 2593] 中 5 在百位上出現了 294 次。

(4)千位(從右至左第4位):由於百千位上的數字 2<5 ,故對照規律(b):(2593//104)×10(4−0)=0 ,也就是說,在 [0 2593] 中 5 在千位上出現了 0 次。

故 5 在 [1,2593] 中共出現了 259+260+294+0=813 次。

class solution:

def numberof1between1andn_solution(self, n):

count = 0

tmp = n

i = 1

while tmp != 0:

# a為每位上的數字

a = tmp % 10

rem = n % (10**i)

con = n // (10**i)

base = 10**(i-1)

if a > 1:

count += (con + 1) * base

elif a < 1:

count += con * base

else:

count += con * base + (rem - 1*base + 1)

tmp = tmp // 10

i += 1

return count

劍指offer 1 找出陣列中重複的數字

給定乙個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。注意 如果某些數字不在 0 n 1 的範圍內,或陣列中不包含重複數字,則返回 1 樣例給定 nums 2...

劍指offer(查詢) 整數中1的出現次數

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數 從1 到 n 中1...

劍指offer 找出陣列中重複的數字

問題 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍裡,不知道重複的數字,也不知道每個重複數字重複幾次,找出陣列中所有重複的數字,如輸入,則應輸出。要求1 能改變陣列中的數字 思路1 將陣列排序,然後遍歷陣列,找出重複的數字。時間複雜度o nlogn 空間複雜度o 1 思路1的實現 vecto...