Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
Example:
Input: 13 Output: 6 Explanation: Digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
思路:
1 暴力求解
依次遍历从1到n的每一个数,将其转换为string,然后统计string中1的个数,运行结果超时。
class Solution {
public:
int countDigitOne(int n) {
int count1 = 0;
while (n >= 1) {
string num = to_string(n);
count1 += count(num.begin(), num.end(), '1');
n--;
}
return count1;
}
};
2 找规律
参考博客:here,我们依次将每个位置中1的个数统计出来,然后累加。
class Solution {
public:
int countDigitOne(int n) {
int countr = 0;
for (long m = 1; m <= n; m *= 10) {
int a = n / m;
int b = n % m;
countr += (a + 8) / 10 * m;
if (a % 10 == 1) countr += b + 1;
}
return countr;
}
};