《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)

原创 2015年11月19日 19:53:48

T:

题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

两种解决方式:找规律和暴力遍历

  • 暴力遍历

化为字符串,或者用10取余,都是一样的道理:

code:

/**
 * 通过统计字符串的方式,计算其包含有多少个1
 * @param n
 * @return
 */
public int test(int n) {
    int count = 0;

    for (int i = 0; i <= n; i++) {
        String ss = String.valueOf(i);
        for (int j = 0; j < ss.length(); j++) {
            if (ss.charAt(j) == '1') {
                count ++;
            }
        }
    }       

    return count;
}
  • 找规律

这里写图片描述

这个规律还真的不好找,我用了好几张稿纸,才算弄出来。。。

具体的细节或者规律的推导过程这里不讲了,就贴我在讨论班上的留言吧:

这里写图片描述

code:

 /**
 * T: 整数中1出现的次数(从1到n整数中1出现的次数)
 * 
 * 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?
 * 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,
 * 但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,
 * 可以很快的求出任意非负整数区间中1出现的次数。
 * 
 * date: 2015.11.19  19:22
 * @author SSS
 *
 */
public class Solution {

    /**
     * 通过找规律求解
     * 这个规律真心不好找。。。
     * @param n
     * @return
     */
    public int NumberOf1Between1AndN_Solution(int n) {

        int count = 0;
        if (n == 0) {
            return count;
        }
        // 该数的长度
        int size = 0;
        int tempN = n;
        while ((int)(tempN / Math.pow(10, size)) != 0) {
            size ++;
        }

        // 标准值,即9,99,999,9999,……中含有多少个1
        int []F = new int[size + 1]; // 下标为0的地方空出来
        F[0] = 0;   // 基本用不着 
        F[1] = 1;
        for (int i = 2; i < F.length; i++) {
            F[i] = (int) (10 * F[i - 1] + Math.pow(10, i - 1));
        }

        int []arr = new int[size + 1];
        tempN = n;
        int tempK = 0;
        // 数字倒着放在数组中,便于计算
        while (tempK < size) {
            arr[size - tempK] = (int) (tempN / Math.pow(10, size - tempK - 1));
            tempN = (int) (tempN % Math.pow(10, size - tempK - 1));
            tempK ++;
        }

        int []f = new int[size + 1];
        // 先确定起点
        if (arr[1] > 0) {
            f[1] = 1;
        } else {
            f[1] = 0;
        }

        for (int i = 2; i < f.length; i++) {
            f[i] = arr[i] * F[i - 1] + f[i - 1];
            int tail;
            int tailNum = (int) (n % Math.pow(10, i - 1));
            if (arr[i] == 0) {
                tail = 0;
            } else if (arr[i] == 1) {
                tail = tailNum + 1;
            } else {
                tail = (int) Math.pow(10, i - 1);
            }
            f[i] += tail;
        }

        count = f[size];

        return count;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)

问题描述: 输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现了5次。 思路:(不考虑时间效率的解法,肯...

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

//题目:从1到n个整数中输出2出现的次数 //解法1:同一每个数字中包含2的次数并相加 public class Main { public static void main(String[] ...

【剑指offer】计算1至n中整数k出现的次数

计算1至n中整数k(包括0)出现的总次数

剑指offer面试题 32:从 1 到 n 整数中 1 出现的次数

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

剑指offer-5-面试32:从 1 到 n 整数中 1 出现的次数(时间效率)

题目 分析 不考虑时间效率的解法靠它想拿offer有点 难 从数字规律着手明显提高时间效率的解法能让面试官耳目一新 测试用例代码 本题考点 题目 从 1 到 n 整数中 1 出现的次数。题...

剑指offer-面试题32-从1到n整数中1出现的次数

解题思路参考自:http://blog.csdn.net/yi_afly/article/details/52012593 1. 题目描述 输入一个整数n,求从1到n这n个整数的十进制表示...

剑指offer-面试题32.从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次   本题可以直接变量1到n的n个数然后...

剑指offer:从1到n整数中1出现的次数(java)

题目:输入一个整数n,求从1到n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次。 不考虑时间效率的解法,靠它想拿offer...

剑指offer <从1 到 n 整数中1 出现的次数>(8)

#  面试题:从1 到 n 整数中1 出现的次数 /* 题目: 输入一个整数 n,求从1 到 n这n个整数的十进制表示中1 出现的次数。 例如: 输入12,从1 到 12...

《剑指offer》:[32]从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12共有1,10,11,12这四个数有1出现,且出现为5次。 方案一:对每一个数字进行统计1的个数,然后相加...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)