1 题目
面试题43. 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
限制:
1 <= n < 2^31
注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/
2 Java
2.1 方法一(思维)
按位遍历n,将第k位固定为1,计算此时高位(k位左侧)和低位(k位右侧)的排列组合,并将所有位的排列组合相加
class Solution {
public int countDigitOne(int n) {
// 计算n有几位
int bits = 0; int temp = n;
while(temp > 0){
temp /= 10;
bits++;
}
// 遍历位,当k位为1,计算高位和低位共有多少种排列组合,计入总数sum
int sum = 0;
for(int k = 1; k <= bits; k++){
// 不能用字符,当k为最高位or最低位,就没有高位/低位,int计算可以算出0,string截取只能得到空,没法转成int
// String s = Integer.toString(n); // 或者String s = String.valueOf(n);
// int high = Integer.parseInt(s.substring(0, k - 1));
// int cur = Integer.parseInt(s.substring(k - 1, k));
// int low = Integer.parseInt(s.substring(k));
int high = n / (int)Math.pow(10, k);
int low = n - n / (int)Math.pow(10, k - 1) * (int)Math.pow(10, k - 1);
int cur = (n - high * (int)Math.pow(10, k) - low) / (int)Math.pow(10, k - 1);
// 根据第k位的值分类,计算公式见代码,还算清晰吧
if(cur == 0) sum += (high + 1 - 1) * (int)Math.pow(10, k - 1);
else if(cur == 1) sum += 1 * (low + 1) + (high + 1 - 1) * (int)Math.pow(10, k - 1);
else if(cur > 1) sum += (high + 1) * (int)Math.pow(10, k - 1);
}
return sum;
}
}