《剑指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——从1到n整数中1出现的次数(好题,新增的解法很好)

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了...

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

int NumberOf1Between1AndN_Solution1(unsigned int n) { int number = 0; for(unsigned int i = ...

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

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

【剑指Offer学习】【面试题32:求从1到n的整数中1出现的次数】

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

剑指offer 面试题32:从1到n整数中1出现的次数(leecode233. Number of Digit One) 题解

剑指offer 面试题32:从1到n整数中1出现的次数(Leecode233. Number of Digit One) 提交网址: http://www.nowcoder.com/prac...

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

题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,也就是说1出现了5次。 方法一:不考虑时间复杂度...

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

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

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

一:题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙...

《剑指Offer》学习笔记--面试题32:从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。 不考虑时间效率的解法,靠它想拿到Off...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
举报原因:
原因补充:

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