本文介绍一种高效、简洁的java方法,通过取模和整除运算逐位提取数字,统计1至100范围内每个数字0–9在所有整数中的总出现次数,避免字符串转换与异常处理,代码健壮且易于理解。
在统计数字频次类问题中,将整数转为字符串再逐字符比较(如 charAt() + String.valueOf())虽直观,但存在明显缺陷:逻辑冗余、易出错(如越界异常)、可读性差,且性能开销大。更优解是采用纯数学方法——利用整数的十进制特性,通过 x % 10 获取个位数字,再用 x /= 10(即 x = x / 10)
去掉该位,循环直至数值归零。
以下是推荐实现:
public class CountEachDigit {
public static void main(String... args) {
final int lo = 1;
final int hi = 100;
int[] digits = countDigits(lo, hi);
for (int i = 0; i < 10; i++) {
System.out.format("The digit %d appears %d times between %d and %d.\n",
i, digits[i], lo, hi);
}
}
private static int[] countDigits(int lo, int hi) {
int[] digits = new int[10]; // 索引0~9对应数字0~9的计数
for (int num = lo; num <= hi; num++) {
int val = num;
do {
digits[val % 10]++; // 提取并统计当前个位数字
} while ((val /= 10) > 0); // 去掉个位,继续处理高位
}
return digits;
}
}关键原理说明:
运行结果:
The digit 0 appears 11 times between 1 and 100. The digit 1 appears 21 times between 1 and 100. The digit 2 appears 20 times between 1 and 100. ... The digit 9 appears 20 times between 1 and 100.
✅ 优势总结:
⚠️ 注意事项:
掌握这种“模10取位 + 整除去位”的模式,是解决数字拆分、回文判断、进制转换等基础算法问题的关键基石。