剑指 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;
    }
};
相关文章
|
6月前
|
机器学习/深度学习
剑指 Offer 15:二进制中1的个数
剑指 Offer 15:二进制中1的个数
58 0
|
1月前
|
C语言
剑指 Offer 15. 二进制中1的个数
这篇文章介绍了如何通过位运算计算一个无符号整数的二进制表示中1的个数,即汉明重量,并提供了相应的C语言函数实现。
34 0
|
6月前
剑指 Offer 11:旋转数组的最小数字
剑指 Offer 11:旋转数组的最小数字
47 1
|
6月前
剑指 Offer 56 - I:数组中数字出现的次数
剑指 Offer 56 - I:数组中数字出现的次数
48 0
|
6月前
剑指 Offer 56 - II:数组中数字出现的次数 II
剑指 Offer 56 - II:数组中数字出现的次数 II
48 0
|
6月前
剑指 Offer 17:打印从1到最大的n位数
剑指 Offer 17:打印从1到最大的n位数
31 0
|
6月前
剑指 Offer 20:表示数值的字符串
剑指 Offer 20:表示数值的字符串
42 0
|
6月前
剑指 Offer 03:数组中重复的数字
剑指 Offer 03:数组中重复的数字
27 0
|
6月前
剑指 Offer 45:把数组排成最小的数
剑指 Offer 45:把数组排成最小的数
31 0
|
6月前
「LeetCode」剑指 Offer 40. 最小的k个数
「LeetCode」剑指 Offer 40. 最小的k个数
52 0