剑指 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

思路:数字n各数位上出现1的次数之和即为1-n中1出现的次数。将数字n分成高位,当前位和低位。如1234,当前位为3的话,高位为12,低位为4。当前位出现1的次数有如下规律:如果当前位为0,则出现次数 = 高位 * 当前数位;当前位为1,则出现次数 = 高位 * 当前数位 + 低位 + 1;当前位为[2-9]中的数字,出现次数为(高位 + 1)* 当前数位。

    public int countDigitOne(int n) {
        int res = 0;
        long i = 1; //当前数位
        while(n / i != 0){
            long high = n / (10 * i); //当前高位
            long cur = (n / i) % 10; //当前位
            long low = n - (n / i) * i; //当前低位
            if(cur == 0){
                res += high * i;
            }else if(cur == 1){
                res += high * i + low + 1;
            }else{
                res += (high + 1) * i;
            }
            i *= 10; // 数位上升
        }
        return res;
    }

参考:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof
 

上一篇:43 流程控制


下一篇:7-43 币值转换 (20 分)