233. 数字 1 的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例 1:

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

输入:n = 0
输出:0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-digit-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一

import java.util.Scanner;

public class Solution {

    private static long[] getLenAndBase(long n) {
        long len = 1;
        long base = 1;
        while (base <= n / 10) {
            base *= 10;
            len++;
        }
        return new long[]{len, base};
    }

    private static long solve(long n) {
        if (n == 0) {
            return 0;
        }

        if (n <= 9) {
            return 1;
        }

        long[] lenAndBase = getLenAndBase(n);

        long len = lenAndBase[0];
        long base = lenAndBase[1];

        long first = n / base;
        long firstOneNum = first == 1 ? n % base + 1 : base;
        long otherOneNum = first * (len - 1) * (base / 10);

        return firstOneNum + otherOneNum + solve(n % base);
    }

    public static int countDigitOne(long n) {
        long ret = 0;

        while (n != 0) {
            long[] lenAndBase = getLenAndBase(n);

            long len = lenAndBase[0];
            long base = lenAndBase[1];

            long first = n / base;
            long firstOneNum = first == 1 ? n % base + 1 : base;
            long otherOneNum = first * (len - 1) * (base / 10);
            ret += firstOneNum + otherOneNum;

            n %= base;
        }

        return (int) ret;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            long n = in.nextLong();
            System.out.println(countDigitOne(n));
        }

    }
}

方法二

class Solution {
    public int countDigitOne(int n) {
        // mulk 表示 10^k
        // 在下面的代码中,可以发现 k 并没有被直接使用到(都是使用 10^k)
        // 但为了让代码看起来更加直观,这里保留了 k
        long mulk = 1;
        int ans = 0;
        for (int k = 0; n >= mulk; ++k) {
            ans += (n / (mulk * 10)) * mulk + Math.min(Math.max(n % (mulk * 10) - mulk + 1, 0), mulk);
            mulk *= 10;
        }
        return ans;
    }
}
posted @ 2021-12-27 16:34  Tianyiya  阅读(56)  评论(0)    收藏  举报