自己不會,看看大神的解法,自己總結一下下,有更好的思路,望指教!
解題思路:將數字進行拆分,分為三部分,高位,低位,和當前位
以求十位出現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出...