给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13。
思路:
- 从小到大,将每个数的1的个数存入一个数组中,
- 每个数计算1的个数的方法是,最高位是否为1,然后去掉最高位查表
class Solution {
public:
int countDigitOne(int n) {
if (n < 0)
return 0;
int cont = getFigures(n);
vector<int>group(pow(10, cont - 1), -1);
int allTimes = 0;
for(size_t i = 0; i <= n; i++)
allTimes += countDigitOne(i, group);
return allTimes;
}
int countDigitOne(int num, vector<int>& group)
{
if (num == 0) {
return 0;
}
if (num < group.size() && group[num] != -1)
return group[num];
int cont = getFigures(num);
int power = pow(10, cont - 1);
int highest = num / power;
int other = num % power;
int time = 0;
if (highest == 1)
time = countDigitOne(other, group) + 1;
else
time = countDigitOne(other, group);
if (num < group.size())
group[num] = time;
return time;
}
int getFigures(int num)
{
int cont = 0;
while(num)
{
num = num / 10;
cont++;
}
return cont;
}
};
结果超时了
方法二:将所有数转化成字符串拼接起来,遍历求1的个数