LeetCode 每日一题 [63] 1~n整数中1出现的次数

LeetCode 1~n整数中1出现的次数 [中等]

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof

示例 1:

输入:n = 12
输出:5

示例 2:

输入:n = 13
输出:6

限制:

1 <= n < 2^31

题目分析
解法1

暴力法 while 循环每个数字,然后转成字符串之后再转为字符数组然后进行比较计数 但是会超时

解法2

数学解法 详细参见:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/ 我是怕我解释不明白

代码实现
public class CountDigitOne {

    public static void main(String[] args) {
        System.out.println(countDigitOne(20));
        System.out.println(countDigitOne1(20));
    }

    public static int countDigitOne1(int n) {
        int digit = 1, res = 0;
        int high = n / 10, cur = n % 10, low = 0;
        while (high != 0 || cur != 0) {
            if (cur == 0) {
                res += high * digit;
            } else if (cur == 1) {
                res += high * digit + low + 1;
            } else {
                res += (high + 1) * digit;
            }
            low += cur * digit;
            cur = high % 10;
            high /= 10;
            digit *= 10;
        }
        return res;
    }

    public static int countDigitOne(int n) {
        int result = 0;
        n++;
        while (n-- > 0) {
            char[] res = String.valueOf(n).toCharArray();
            for (char re : res) {
                if (re == '1') {
                    result++;
                }
            }
        }
        return result;
    }
}

你可能感兴趣的:(LeetCode 每日一题 [63] 1~n整数中1出现的次数)