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

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

        String str = n + "";
        return NumberOf1(str);
    }

    public int NumberOf1(String str) {
        char[] num = str.toCharArray();
        int length = num.length;

        if (length == 1 && num[0] == '0') {
            return 0;
        }

        if (length == 1 && num[0] >= '1') {
            return 1;
        }

        //1在最高位出现的次数
        int firstDigit = 0;

        if (num[0] > '1') {
            firstDigit = (int) Math.pow(10, length - 1);
        }

        if (num[0] == '1') {
            firstDigit = Integer.parseInt(str.substring(1)) + 1;
        }

        int otherDigits = (int) ((num[0] - '0') * (length - 1) * Math.pow(10, length - 2));
        int recursiveDigits = NumberOf1(str.substring(1));

        int result = firstDigit + otherDigits + recursiveDigits;
        return result;
    }

    public static void main(String[] args) {
        int n = 22;

        P221_NumberOf1Between1AndN test = new P221_NumberOf1Between1AndN();
        int result = test.NumberOf1Between1AndN(n);

        System.out.println(result);

    }
}

猜你喜欢

转载自blog.csdn.net/Sunshine_liang1/article/details/82860555
今日推荐