整数中1出现的次数
C++,模拟,经典题。
有点像数学题2333。
思路:
- 从个位到最高位遍历n,用cur表示当前位的数字,it表示是个位百位千位。。。,left表示左边的数,right表示右边的数,比如
n = 12345, it = 100
,则cur = 3, left = 12, right = 45
; - 以上n = 12015为例,将每个位上1的个数都算出来,然后求和,问题就解决了;
- 以下分三种情况来解,即cur = 1,cur > 1,cur = 0;
- 当it = 10,cur = 1,left = 120,right = 5,则十位上1的个数为
left * it + right + 1
,其实就是[0-119]-1-[0-9] + [120]-1-[0-5]
; - 当it = 100,cur = 0,left = 12,right = 15,则百位上1的个数为
left * it
,其实就是[0-11]-1-[0-99]
; - 当it = 1000,cur = 2,left = 1,right = 15,则千位上1的个数为
left * it + left
,其实就是[0]-1-[0-999] + [1]-1-[0-999]
; - 按照上述三种情况,将每个位的1数出来,累加即可。
代码:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
int it = 1, left = 0, right = 0, cur = n % it;
int ans = 0;
while (n / it) {
left = n / (it * 10), right = n % it;
cur = (n / it) % 10 ;
if (cur == 0)
ans += left * it;
else if (cur == 1)
ans += left * it + right + 1;
else
ans += left * it + it;
it *= 10;
}
return ans;
}
};