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

来源:互联网 发布:python twisted 安装 编辑:程序博客网 时间:2024/04/27 18:17

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;    }}
0 0