美文网首页
LeetCode 每日一题 [63] 1~n整数中1出现的次数

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

作者: 是小猪童鞋啦 | 来源:发表于2020-07-22 07:47 被阅读0次
    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出现的次数

          本文链接:https://www.haomeiwen.com/subject/yqafzhtx.html