东寻

导航

整数中1出现的次数

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

思路

数字转字符串统计。
时间复杂度O(nlgn),空间复杂度O(nlgn)。

数学方法分析。
循环数字的每一位,固定该位,计算其余位的组合情况。
时间复杂度O(len),空间复杂度O(1)。

转字符串代码

public class Solution {    
    public int NumberOf1Between1AndN_Solution(int n) {
        if(n < 1)    return 0;
        int count = 0;
        char[] cs = null;
        for(int i = 1; i <= n; i++) {
            cs = (i+"").toCharArray();
            for(char c : cs) {
                if(c == '1') {
                    count++;
                }
            }
        }
        return count;
    }
}

数学方法代码

public class Solution {    
    public int NumberOf1Between1AndN_Solution(int n) {
        if(n < 1)    return 0;
        int count = 0;
        int a = 0, b = 0;
        for(int k = 1; k <= n; k*=10) {
            a = n/k;
            b = n%k;
            count += (a+8)/10*k + (a%10 == 1 ? b+1 : 0);
        }
        return count;
    }
}

笔记

(a+8)/10*k ≠ k*(a+8)/10
  • String转int两种方式
    1.Integer.parseInt(str)
    2.Integer.valueOf(str).intValue()

  • int转String三种方式
    1.num + ""
    2.String.valueOf(num)
    2.Integer.toString(num)

posted on 2020-02-23 13:54  东寻  阅读(180)  评论(0编辑  收藏  举报