题目描述
输入一个整数 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
参考解题思路:计算每个位上1出现的次数再相加
定义long类型(避免超过Int数值范围)的高位标识high、当前位标识cur、低位low、 位置因数dight
寻找当前位为不同情况时候1出现的次数规律如下:
- 当前位为0时:count += hight * dight
- 当前位为1时:count += hight * dight + (low + 1)
- 当前位为2、3、4~9时:count += (hight + 1) * dight
public int countDigitOne(int n) {
int count = 0; // 为1的总和
long digit = 1; // 10的次方
while (n/digit != 0){
long high = n / (digit * 10); // 高位
long cur = (n / digit) % 10; // 当前位
long low = n - (n / digit) * digit; // 低位
if (cur == 0) {
count += high * digit;
} else if (cur == 1) {
count += high * digit + (low + 1);
} else {
count += (high + 1) * digit;
}
digit = digit * 10; // 位置因素找下一位
}
return count;
}
复杂度分析:
时间复杂度O(logn) : 循环内的计算操作使用O(1) 时间;循环次数为数字 n 的位数,因此循环使用 O(logn) 时间。
空间复杂度O(1) : 几个变量使用常数大小的额外空间。
作者:jyd
链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/