剑指Offer-33-从1到n整数中1出现的次数

题目

输入一个整数n, 求从1到n,这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的个数有1,10,11和12,1一共出现了5次。

解析

此题其实问的就是1到n的十进制中1出现的个数。

思路一

那么很显然常规的做法就是对于得到每个数,统计出1出现的个数即可。
通过与10取余即可得到个位,判断是否为1即可。
原数除以10即可达到右移10进制一位的效果。
遍历数的十进制位数需要log(n)次,故总复杂度为O(nlogn)

    public static int NumberOf1Between1AndN_Solution2(int n) {
        int count = 0;
        for(int i = 1; i <= n; i++) {
            count += NumberOfOne(i);
        }
        return count;
    }

    /**
     * 遍历数的每一位,统计1的个数
     * @param num
     * @return
     */
    public static int NumberOfOne(int num) {
        int count = 0;
        while(num != 0) {
            if(num % 10 == 1) {
                count++;
            }
            num /= 10;
        }
        return count;
    }

思路二

其实也是遍历每一个数,不过我们借助字符串可以很方便遍历数的每一位,判断其是否等于’1’字符即可。有效的避免的思路一中繁琐的取余和除法操作。

缺点,生成了一堆String对象,会消耗过多的方法区中运行常量池的内存空间。

    public static int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;
        for(int i = 1; i <= n; i++) {
            String num = String.valueOf(i);
            for (int j = 0; i < num.length(); i++) {
                count += num.charAt(i) == '1' ? 1 : 0;
            }
        }
        return count;
    }

思路三

就是找规律,此处埋个坑,方法挺多的,找个时间好好消化一下,之后再认真的写出来。

猜你喜欢

转载自blog.csdn.net/dawn_after_dark/article/details/81194681