整数中1出现的次数

你快乐吗?

Posted by bbkgl on September 26, 2019

整数中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;
    }
};