剑指offer 32.整数中1出现的次数

  1. 题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
  2. 思路:
    1. 这是一个非常棒的题目,暴力求解的复杂度肯定过高
    2. 可以求解h所在的每一位为1的所有次数,求和即可【具体参考代码中的例子https://blog.csdn.net/weixin_41025517/article/details/85177507
  3. 启发或者坑
    1. 巧妙的题目,需要巧妙的解法,要善于动脑筋
  4. 代码
    class Solution {
    public:
        int NumberOf1Between1AndN_Solution(int n)
        {
            //https://blog.csdn.net/weixin_41025517/article/details/85177507
            //暴力求解就是遍历1-n,然后求解每一个1的个数,这个是n^2复杂度
            //看了以上这篇blog受益匪浅呀
            //可以求解n所在的每一位为1的所有次数,求和即可
            //13089   百位为1 :0-99的所有 13*100
            //13189  百位为1: 13*100 +  89 + 1
            //13289 百位为1: 1400
            int v;
            int sum = 0;
            int a, b;
            for(int i = 1; i <= n; i=i*10){
                a = n/i;
                b = n%i;
                v = a%10;
                if (v == 0) {
                    sum = sum +  a/10*i;
                } else if ( v == 1) {
                    sum = sum + a/10*i+ b +1;
                } else {
                  //v >2
                    sum = sum + (a/10+1)*i;
                }
            }
            return sum;
        }
             
    };
    
发布了131 篇原创文章 · 获赞 5 · 访问量 7394

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/103866462