剑指 Offer 43:1~n 整数中 1 出现的次数

简介: 剑指 Offer 43:1~n 整数中 1 出现的次数

题目

题目链接

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

示例 1:

输入:n = 12
输出:5

示例 2:

输入:n = 13
输出:6

解题

方法一:暴力(超时)

class Solution {
private:
    int countOne(int n){
        string str=to_string(n);
        int res=0;
        for(char c:str){
            if(c=='1') res++;
        }
        return res;
    }
public:
    int countDigitOne(int n) {
        int res=0;
        for(int i=1;i<=n;i++){
            res+=countOne(i);
        }
        return res;
    }
};

方法二:

参考链接

class Solution {
public:
    int countDigitOne(int n) {
        int high=n;//高位
        int low=0;//低位
        int cur=0;//当前所在位的值 
        int count=0;//1出现得次数
        long num=1;//当前位的位因子(num*=10用int会溢出)
        while(high||cur){
            cur=high%10;
            high/=10;
            if(cur==0) count+=high*num;
            else if(cur==1) count+=high*num+low+1;  
            else count+=high*num+num;
            low=cur*num+low;
            num*=10;
        }
        return count;
    }
};
相关文章
|
5月前
|
机器学习/深度学习
剑指 Offer 15:二进制中1的个数
剑指 Offer 15:二进制中1的个数
49 0
|
5月前
剑指 Offer 11:旋转数组的最小数字
剑指 Offer 11:旋转数组的最小数字
42 1
|
5月前
剑指 Offer 56 - II:数组中数字出现的次数 II
剑指 Offer 56 - II:数组中数字出现的次数 II
42 0
|
5月前
剑指 Offer 56 - I:数组中数字出现的次数
剑指 Offer 56 - I:数组中数字出现的次数
43 0
|
5月前
剑指 Offer 20:表示数值的字符串
剑指 Offer 20:表示数值的字符串
38 0
|
5月前
剑指 Offer 17:打印从1到最大的n位数
剑指 Offer 17:打印从1到最大的n位数
30 0
|
5月前
剑指 Offer 03:数组中重复的数字
剑指 Offer 03:数组中重复的数字
25 0
|
5月前
「LeetCode」剑指 Offer 40. 最小的k个数
「LeetCode」剑指 Offer 40. 最小的k个数
47 0
|
5月前
leetcode 剑指 Offer 40. 最小的k个数
leetcode 剑指 Offer 40. 最小的k个数
30 0