难度困难
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
限制:
-
1 <= n < 2^31
class Solution {
public int countDigitOne(int n) {
if (n == 0) {
return 0;
}
if (n < 10) {
return 1;
}
String num = String.valueOf(n);
int length = num.length();
//这个base是解题速度100%的关键,本例中的是 9的话就是1
// 99的话就是20 ; 999中1的个数:300;9999就是4000 这里大家应该发现规律了吧。
int cur = (int) Math.pow(10, length - 2);
int base = (length - 1) * cur;
cur *= 10;//1234为例,cur是1000,
int first = num.charAt(0) - '0'; //1234为例,first是1,
if (first == 1) {
//1234为例,base是1000前1的总个数,
//(n-cur+1)是1000~1234,代表千位数为1时候的个数,总共235个1,
//countDigitOne(n-cur)代表234里面的1,递归下一轮
return base + (n - cur + 1) + countDigitOne(n - cur);
} else {
//8234为例,base*first是8000前1的总个数,
//cur是1000,代表千位数为1时候的个数,
//countDigitOne(8234为例-8000)代表234里面的1,递归下一轮
return base * first + cur + countDigitOne(n - first * cur);
}
}
}