LeetCode Number of Digit One

原题链接在这里: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 }

 

posted @ 2015-10-29 13:07  Dylan_Java_NYC  阅读(149)  评论(0编辑  收藏  举报