动态规划:不含相同数字的数字个数

    给定一个常数n,求满足0<=x<10^n,且不包含相同数字的x的个数。例如给定n = 2,则 0<=x<100,且x不能为以下数字:11,22,33... 99,因此x的个数为91。

    分析:当n=0时,只有一个值0

             当n=1时,除0外,x可以是1,2..9中的任意一个,个数为9。

             当n=2时,除了一位的数字,两位的数字可以如下方式组成:第一位从1..9中选一个(最高位不能为0),第二位从剩下的9个数字中选一个。因此,两位数的个数有9*9。

             当n=3时,除了一位和两位的数字,三位的数字可以以如下方式组成:第一位从1...9中选一个,第二位从剩下的9个中选一个,第三位从剩下的8位中选一个。因此,三位数的个数为 9 * 9 * 8

            。。。

             当n=k时,k位的数字个数为9*9*8*7...

    public int countNumbersWithUniqueDigits(int n) {
        int[] array = new int[]{9,9,8,7,6,5,4,3,2,1};
        int total = 0; 
        int carry = 1;
        for (int i = 0; i <= n; i++) {
            total += carry; //位数分别为0、1、2...n的数字个数相加
            if (i < array.length) {
                carry *= array[i];
            } else { //如果大于10,将不存在数字不同个的数字
                break;
            }
        }
        return total;
    }
}

    

猜你喜欢

转载自blog.csdn.net/xiezongsheng1990/article/details/79944906