《剑指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-整数中1出现的次数(从1到n整数中1出现的次数)

整数中1出现的次数(从1到n整数中1出现的次数) 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、1...
  • huzhigenlaohu
  • huzhigenlaohu
  • 2016年06月28日 22:34
  • 3012

从1到n整数中1出现的次数:O(logn)算法

1. 题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。2. 题目来源第一次看到是在《剑指...
  • yi_Afly
  • yi_Afly
  • 2016年07月26日 13:13
  • 6877

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

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

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 分析:这是一道广为流传的go...
  • qq_27093465
  • qq_27093465
  • 2017年02月08日 16:26
  • 1829

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

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

[分析总结:leetcode-Number of Digit One]寻找整数1到n之间所有数字中1出现的次数

leetcode原题链接:https://leetcode.com/problems/number-of-digit-one/ 题目描述: 要求寻找整数1到n之间所有数字中,1出现的次数。如给定...
  • cancan0520
  • cancan0520
  • 2015年07月09日 15:46
  • 1027

编程之美读书笔记(3) 统计在从1到n的正整数中1出现的次数

问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1, 2, ...
  • SJF0115
  • SJF0115
  • 2013年02月22日 11:30
  • 16165

[笔试题]求自然数0-1000000中1出现的次数

题目描述 求自然数0-1000000中1出现的次数。 思路 考虑六位字符000000-999999,共有字符 6位*1000 000个数=6 000 000个字符。0-9这是个字符等概率出现...
  • lonfee88
  • lonfee88
  • 2012年09月23日 00:15
  • 1980

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

题目描述        求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于...
  • sinat_33718563
  • sinat_33718563
  • 2017年07月07日 20:42
  • 192

算法:从1到n整数中1出现的次数

问题:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 最笨的方法:穷举法,从1到n,计算每个数中出现的1的次数,然后累加。时间复杂度为O(n*logn)。 //穷举法 int N...
  • zaizai09
  • zaizai09
  • 2014年03月31日 22:29
  • 914
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
举报原因:
原因补充:

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