其他題目 1到n中1出現的次數

2021-08-09 21:54:15 字數 1652 閱讀 9350

【題目】

給定乙個整數n,返回1到n的數字中1出現的個數。

例如:

n = 5,1~n為1,2,3,4,5。那麼1出現了1次,所以返回1。

n = 11,1~n為1,2,3,4,5,6,7,8,9,10,11。1出現了4次,返回4。

【基本思路】

方法一。暴力的方式,逐個檢查每個數字中1的個數,十進位制的整數n有logn位,所以考察乙個整數含有多少個1的代價是o(logn),一共有n個數,所以時間複雜度為o(nlogn)。

#python3.5

defonenums1

(num):

if num < 1:

return

0 res = 0

for i in range(1, num+1):

cur = i

tmp = 0

while cur != 0:

if cur % 10 == 1:

tmp += 1

cur //= 10

res += tmp

return res

方法二。觀察所有數字中1出現的規律。以數字12345為例,將12345分成1~2345,2346~12345兩段,先看2346~12345這一段。首先看萬位1出現的次數,只能是10000~12345,一共2345+1個。接下來看千位1出現的次數,那就是千位固定1不動,其他位自由變化,萬位能變化的範圍是0~1,但是區間是2346~12345,所以只能表達1w個數,個十百位能變化的範圍是0~9,所有總的個數是1*10*10*10;同樣百(十)位1出現的次數,那就是百(十)位固定1不動,其他位自由變化,總的個數也是1*10*10*10。因此2346~12345上1出現的次數便可知。接下來1~2345上1出現的次數可以按照上述方法遞迴求解。

這是以1開頭的數字的情況,如果不是以1開頭,那麼最高位1出現的情況就是10000…~19999…

def

onenums2

(num):

defgetlength

(num):

res = 0

while num != 0:

res += 1

num //= 10

return res

if num < 1:

return

0 length = getlength(num)

base = int(math.pow(10, length-1))

first = num // base

firstonenum = num % base + 1

if first == 1

else base

otheronenum = first * (length-1) * (base // 10)

return firstonenum + otheronenum + onenums2(num % base)

分析**可知,n共有多少位,遞迴函式就會被呼叫多少次,即logn次。每次遞迴內部的複雜度也是logn,所以總體時間複雜度為o(logn*logn)。

1到n整數中1出現的次數

1.分析 如果 n 12 即 1 12 中含有1 的數有 1 10 11,12 則1出現的次數為 5 假如計算 1 31245 怎麼計算 第一步 分為兩段 1245 和 1246 31245 第兩步 分別計算這兩段中1出現的次數,最後結果相加 首先計算1246 31245 這一段的1出現的次數 三種...

整數1到n中1出現的次數

比如求出1 13的整數中1出現的次數,1 13中包含1的數字有1 10 11 12 13因此共出現6次,把問題更加普遍化,求出任意非負整數區間中1出現的次數 從1 到 n 中1出現的次數 參考自部落格 按位依次計算,計算出現在個位上1的次數,十位上1的次數.對於某一位的1的個數如此計算,比如對980...

整數中1出現的次數(從1到n整數中1出現的次數)

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