关闭

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

标签: 算法java牛客剑指offer
639人阅读 评论(0) 收藏 举报
分类:

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

  相关文章推荐
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36993次
    • 积分:1117
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类