原題鏈接在這里:https://leetcode.com/problems/number-of-digit-one/
每10個數, 有一個個位是1, 每100個數, 有10個十位是1, 每1000個數, 有100個百位是1.? 做一個循環, 每次計算單個位上1得總個數(個位,十位, 百位).??
例子:
以算百位上1為例子: ? 假設百位上是0, 1, 和 >=2 三種情況:?
leetCode。??? case 1: n=3141092, a= 31410, b=92. 計算百位上1的個數應該為 3141 *100 次.
??? case 2: n=3141192, a= 31411, b=92. 計算百位上1的個數應該為 3141 *100 + (92+1) 次.?
??? case 3: n=3141592, a= 31415, b=92. 計算百位上1的個數應該為 (3141+1) *100 次.?
以上三種情況可以用 一個公式概括:(a + 8) / 10 * m + (a % 10 == 1) * (b + 1);
期中 (a+8)/10 是用來判斷該位是否大于等于2.
leetcode121、AC Java:
1 public class Solution { 2 public int countDigitOne(int n) { 3 //(a+8)/10*m + (a%10 == 1)*(b+1) 4 int res = 0; 5 for(long m = 1; m<=n; m*=10){ 6 long a = n/m; 7 long b = n%m; 8 res+=(a+8)/10 * m; 9 if(a%10 == 1){ 10 res+=(b+1); 11 } 12 } 13 return res; 14 } 15 }
?