leetcode-233:数字 1 的个数

简介: leetcode-233:数字 1 的个数

题目

题目连接

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

示例 1:

输入:n = 13
输出:6

示例 2:

输入:n = 0
输出:0

解题

方法一:数位 DP

参考链接

class Solution {
public:
    int countDigitOne(int n) {
        string s=to_string(n);
        int m=s.size();
        if(m==1) return n>0?1:0;
        // 计算第 i 位前缀代表的数值,和后缀代表的数值
        // 例如 abcde 则有 ps[2] = ab; ss[2] = de
        vector<int> ps(m),ss(m);
        ss[0]=stoi(s.substr(1));
        for(int i=1;i<m-1;i++){
            ps[i]=stoi(s.substr(0,i));
            ss[i]=stoi(s.substr(i+1));
        }
        ps[m-1]=stoi(s.substr(0,m-1));
        int res=0;
        for(int i=0;i<m;i++){
            int x=s[i]-'0';// x 为当前位数值
            int len=m-i-1;//当前位后面长度
            int prefix=ps[i],suffix=ss[i];
            int tot=0;
            tot+=prefix*pow(10,len);
            if(x==0){}
            else if(x==1){
                tot+=suffix+1;
            }else{
                tot+=pow(10,len);
            }
            res+=tot;
        }
        return res;
    }
};
相关文章
|
算法 测试技术 C#
C++数位算法:数字1的个数
C++数位算法:数字1的个数
|
7月前
leetcode-1365:有多少小于当前数字的数字
leetcode-1365:有多少小于当前数字的数字
43 0
|
7月前
leetcode-373:查找和最小的 K 对数字
leetcode-373:查找和最小的 K 对数字
47 0
|
C++
LeetCode 43. 字符串相乘C++代码 超过100%
LeetCode 43. 字符串相乘C++代码 超过100%
86 0
|
算法 C++ Python
每日算法系列【LeetCode 233】数字 1 的个数
每日算法系列【LeetCode 233】数字 1 的个数
7-10 求数字个数
7-10 求数字个数
95 0
leetcode 1356 根据数字二进制下1的数目排序
leetcode 1356 根据数字二进制下1的数目排序
73 0
leetcode 1356 根据数字二进制下1的数目排序
|
存储 算法
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字
思路:对于对于任意一个丑数 x,其与任意的质因数(2、3、5)相乘,结果(2x、3x、5x)仍为丑数。因此可以使用优先队列(小根堆)存放丑数x,每次从队列取出最小值x,并将x所对应的2x、3x和5x入队。第n次出队的值即为第n个丑数
271 0
【题型总结】找到第n个自定义数 | 丑数系列 + 神奇数字