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

2021-10-08 16:11:56 字數 1861 閱讀 6099

自己不會,看看大神的解法,自己總結一下下,有更好的思路,望指教!

解題思路:將數字進行拆分,分為三部分,高位,低位,和當前位

以求十位出現1的次數為例,digit=10;

1.以n=1202為例,此時,高位high=12,低位low=2,當前位cur=0

此時十位出現1 的數字的範圍是:0010-1119

0010

-0019中共有10次1出現

0110

-0119中共有10次1出現

……0910

-0919中共有10次1出現

1010

-1019中共有10次1出現

1110

-1119中共有10次1出現

可以看出高位從00-11共變化了12次,有十二種選擇,在高位固定為某一種情況時,當前位的變化在0-9,公有10 種選擇,組合後為120.在數字變化範圍0010-1119中去掉當前位,只看高位和低位,就會發現000-119,總數為120.

得到結論:當前位cur=0;此位出現1的個數的計算公式為:high*digit

2.以n=1212為例,此時,高位high=12,低位low=2,當前位cur=1;

此時十位出現1 的數字的範圍是:0010-1212

0010

-0019中共有10次1出現

0110

-0119中共有10次1出現

……0910

-0919中共有10次1出現

1010

-1019中共有10次1出現

1110

-1119中共有10次1出現

1210

-1212中公有3次1出現

可以看出高位從00-11共變化了12次,有十二種選擇,在高位固定為某一種情況時,當前位的變化在0-9,公有10 種選擇,組合後為120.但是在1210-1212中有三次1出現。公有123次1出現。在數字變化範圍0010-1212中去掉當前位,只看高位和低位,就會發現000-122,總數為123.

得到結論:當前位cur=1;此位出現1的個數的計算公式為:high*digit+low+1

3.以n=1222為例,此時,高位high=12,低位low=2,當前位cur>1;

此時十位出現1 的數字的範圍是:0010-1219

0010

-0019中共有10次1出現

0110

-0119中共有10次1出現

……0910

-0919中共有10次1出現

1010

-1019中共有10次1出現

1110

-1119中共有10次1出現

1210

-1219中公有10次1出現

可以看出高位從00-12共變化了13次,有十二種選擇,在高位固定為某一種情況時,當前位的變化在0-9,公有10 種選擇,組合後為130.在數字變化範圍0010-1219中去掉當前位,只看高位和低位,就會發現000-129,總數為130.

得到結論:當前位cur>1;此位出現1的個數的計算公式為:(high+1)*digit

class

solution

else

if(cur==1)

else

low+

=cur*digit;

digit*=10

; cur=high%10;

high/=10

;}return count;}}

;

1 n整數中1出現的次數

示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 62.1 思路分析 題目要求1 n中1出現的次數,考慮將n轉換為字串,然後統計字元1的個數,但這樣會超時 既然1不行,換一種思路,將n轉換為字串後,可以容易確定n的位數 利用for迴圈,從個位開始直到最高位,計算每一位上1出現的次數...

1 n 整數中1出現的次數(21)

方法一 將每個數字中的1的個數進行相加,最終的結果就是1出現的總的次數。但是這種方法的效率較低,時間複雜度為 o n log n o n log n o n lo gn 當n非常大的時候,需要大量的計算。class solution return sumofone int numofone int ...

1 n中1出現的次數

輸入乙個整數 n 求1 n這n個整數的十進位制表示中1出現的次數。例如,輸入12,1 12這些整數中包含1 的數字有1 10 11和12,1一共出現了5次。示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 6 解析需要通過找規律來分析。假設我們對5014這個數字求解。1 個位上1出...