数字1的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例:

输入: 13
输出: 6 
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13。

 思路:

  1. 从小到大,将每个数的1的个数存入一个数组中,
  2. 每个数计算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的个数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值