当前位置 博文首页 > 庆述倾述:1~n 整数中 1 出现的次数

    庆述倾述:1~n 整数中 1 出现的次数

    作者:[db:作者] 时间:2021-08-05 12:51

    刷题记录第23题,上一题:字符串的排列,本题地址:1~n 整数中 1 出现的次数。

    题目描述:
    输入一个整数 n ,求1~nn个整数的十进制表示中1出现的次数。

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

    示例 1

    输入:n = 12
    输出:5
    示例 2:
    
    输入:n = 13
    输出:6
    

    限制:
    1 <= n < 2^31

    发现了一个大佬,大佬讲的太清晰了,地址:LeetCode刷题力扣题解 | 剑指Offer 43. 1~n 整数中 1 出现的次数 。

    在这里插入图片描述
    具体思路为,求该数字的每个位置,假定该位置为1,可以产生多少个数字。以图中3101595为例。分为三种情况:

    • 当前位置数字大于1,那么左边部分a的可取值为0000~3101,也就是a+1个数字,而对于右半部分,因为cur大于1,当固定为1的时候,可取值为00~99,即base
    • 当前位置数字等于1,那么左边部分a的取值可分为两种情况,当可取值范围为000~309,即a,右边部分可取值为base,当a取值为310时候,右边部分可取值为b+1
    • 当前位置数字等于0,那么当我们假定当前位置取1,那么左边部分可取值为a,右半部分可取值为base
    class Solution {
        public int countDigitOne(int n) {
            int low = 0, cur = n % 10, high = n / 10;
            int count = 0, digit = 1;
            while(digit <= n){
                if(cur > 1) count += (high + 1) * digit;
                else if(cur == 1) count += high * digit + low + 1;
                else count += high * digit;
    
                low += cur * digit;
                cur = high % 10;
                high = high / 10;
                digit *= 10;
            }
            return count;
        }
    }
    
    cs
    下一篇:没有了