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
7-10 求数字个数
7-10 求数字个数
95 0
leetcode 1356 根据数字二进制下1的数目排序
leetcode 1356 根据数字二进制下1的数目排序
73 0
leetcode 1356 根据数字二进制下1的数目排序
LeetCode 1356. 根据数字二进制下 1 的数目排序
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
83 0
|
算法 Java C#
数组中数字出现的个数(剑指offer 56-I)
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。