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;
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号