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;
    }
};
相关文章
|
12月前
|
算法 测试技术 C#
C++数位算法:数字1的个数
C++数位算法:数字1的个数
|
5月前
leetcode-1365:有多少小于当前数字的数字
leetcode-1365:有多少小于当前数字的数字
35 0
|
5月前
leetcode-373:查找和最小的 K 对数字
leetcode-373:查找和最小的 K 对数字
36 0
|
12月前
【Leetcode-136.只出现一次的数字 -169.多数元素】
【Leetcode-136.只出现一次的数字 -169.多数元素】
40 0
旋转数组的最小数字
旋转数组的最小数字
44 0
剑指offer_数组---旋转数组的最小数字
剑指offer_数组---旋转数组的最小数字
39 0
|
算法 C++ Python
每日算法系列【LeetCode 233】数字 1 的个数
每日算法系列【LeetCode 233】数字 1 的个数
|
算法 C++ Python
每日算法系列【LeetCode 357】计算各个位数不同的数字个数
每日算法系列【LeetCode 357】计算各个位数不同的数字个数