原题链接在这里:https://leetcode.com/problems/number-of-digit-one/
每10个数, 有一个个位是1, 每100个数, 有10个十位是1, 每1000个数, 有100个百位是1. 做一个循环, 每次计算单个位上1得总个数(个位,十位, 百位).
例子:
以算百位上1为例子: 假设百位上是0, 1, 和 >=2 三种情况:
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.
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 }