目录
1~n整数中1出现的次数
描述
示例 1
示例 2
限制
方法:找规律
1~n整数中1出现的次数
描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1
输入
n = 12输出
5
示例 2
输入
n = 13输出
6
限制
方法:找规律
这个题比较巧妙,如果一个个数遍历判断结果会超时,所以用到找规律的方法(K神思路)。
假设数字n为x位数,记n的第i位为,可以将n写为:
- 称为当前位,记为cur
- 将称为低位,记为low
- 将称为高位,记为high
- 将称为位因子,记为digit
根据当前位 cur 值的不同,分为以下三种情况:
1、当 cur=0 时: 此位 1 的出现次数只由高位 high 决定,计算公式为:
例如下图,以n=2304为例,求digit=10的1出现次数
2、当 cur=1 时: 此位 1 的出现次数由高位 high 和低位 low 决定,计算公式为:
例如下图,以n=2314为例,求digit=10的1出现次数
3、当 cur=2,3,⋯,9 时: 此位 1 的出现次数只由高位 high 决定,计算公式为:
例如下图,以n=2324为例,求digit=10的1出现次数
class Solution {
public int countDigitOne(int n) {
int digit = 1, res = 0;
int high = n / 10, cur = n % 10, low = 0;
while(high != 0 || cur != 0) {
if(cur == 0) res += high * digit;
else if(cur == 1) res += high * digit + low + 1;
else res += (high + 1) * digit;
low += cur * digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return res;
}
}



