一.题目
这道题足足搞了2h,过程坎坷,先是自己怎么想都没做出来,然后去理解了别人的解法。发现关键那一步怎么都看不懂,就去看了y总20mins的讲解,一个多小时(只看了前面20mins,因为整个视频有一个多小时,但是后面几乎都在翻车)。略微懂了一点,但最终理解还是自己结合例子看代码,debug了一下。
二.代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] res = new int[10];
while(true) {
int a = scanner.nextInt();
int b = scanner.nextInt();
if(a == 0 && b == 0) break;
if(a > b) {
int t = a;
a = b;
b = t;
}
for(int i = 0;i <= 9;i ++) {
System.out.print(count(b, i) - count(a - 1, i) + " ");
}
System.out.println();
}
}
// 这里是关键代码块
public static int count(int n, int i) {从1到n看i出现过几次
int bits = getBits(n); //获取n这个整数有多少位
int res = 0;
for (int j = 1;j <= bits;j ++) { // 从最右边的数字开始
int p = (int) Math.pow(10, j - 1); // 获得该位上的权重
int l = n / p / 10; // 获得该位左边的数
int r = n % p; // 获得该位上右边的数
int dj = n / p % 10; // 获得该位上的数
// 以下四种情况即能将所有i出现的次数加起来
if(i != 0) res += l * p;
else if(l != 0) res += (l - 1) * p;
if(dj > i && (i != 0 || l != 0)) res += p;
if (dj == i && (i != 0 || l != 0)) res += r + 1;
}
return res;
}
private static int getBits(int n) {
int res = 0;
while (n != 0) { //通过除10不断得到有多少位
res ++;
n /= 10;
}
return res;
}
}