Number of Digit One

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.

For example:
Given n = 13,
Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.

分析:

假设给定数字327,那么个位上最多会出现多少次1呢?是不是应该有33个?从001, 011,021,031,一直到321呢?答案是对的。

那么十位上有多少个一呢,是不是有(3+1)*10 = 40个呢?怎么算的呢?011,012, 013,。。。 111, 112, 113,。。。 211,212,213.。。311,312,313,。。。319。

那么百位上有多少1呢,是不是有1*100呢?答案也是正确的。从100 到199.

这里有特殊情况,比如,317,十位上有多少个1呢,答案是3 * 10 + 18。

对于123,那么对于百位上有多少个1呢,是不是24个?从100 到123.

对于302,十位上有多少个1呢?是不是就是30个呢? 010-019, 110-119, 210-219.

这里还有两个special case:

1. 当k=0,那么0在最高位的时候,不能用一般的方法处理。

2. 当k = 0 并且 n = 0, 这种情况下返回1

 1 class Solution {
 2 
 3     public int digitCounts(int k, int n) {
 4         if (k == 0 && n == 0) return 1;
 5         
 6         int total = 0, expo = 1;
 7         
 8         while (n / expo >= 1) {
 9             int current = (n / expo) % 10;
10             int before = n / (10 * expo);
11             int after = n % expo;
12             
13             if (k == 0 && before == 0) {  // handle k = 0 and we are handling the case in which 0 is at the first place.
14                 break;
15             }
16             
17             if (current > k) {
18                 total += (before + 1) * expo;
19             } else if (current == k) {
20                 total += before * expo + after + 1;
21             } else {
22                 total += before * expo;
23             }
24             
25             expo *= 10;
26         }
27         return total;
28         
29     }
30 };

 

posted @ 2016-08-07 11:48  北叶青藤  阅读(233)  评论(0)    收藏  举报