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 };

浙公网安备 33010602011771号