刷题记录第23题,上一题:字符串的排列,本题地址: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
发现了一个大佬,大佬讲的太清晰了,地址:LeetCode刷题力扣题解 | 剑指Offer 43. 1~n 整数中 1 出现的次数 。
具体思路为,求该数字的每个位置,假定该位置为1 ,可以产生多少个数字。以图中3101595 为例。分为三种情况:
- 当前位置数字大于
1 ,那么左边部分a 的可取值为0000~3101 ,也就是a+1 个数字,而对于右半部分,因为cur 大于1 ,当固定为1 的时候,可取值为00~99 ,即base ; - 当前位置数字等于
1 ,那么左边部分a 的取值可分为两种情况,当可取值范围为000~309 ,即a ,右边部分可取值为base ,当a 取值为310 时候,右边部分可取值为b+1 ; - 当前位置数字等于
0 ,那么当我们假定当前位置取1 ,那么左边部分可取值为a ,右半部分可取值为base ;
class Solution {
public int countDigitOne(int n) {
int low = 0, cur = n % 10, high = n / 10;
int count = 0, digit = 1;
while(digit <= n){
if(cur > 1) count += (high + 1) * digit;
else if(cur == 1) count += high * digit + low + 1;
else count += high * digit;
low += cur * digit;
cur = high % 10;
high = high / 10;
digit *= 10;
}
return count;
}
}
|