数字都不同?排列组合安排上!
题意如下:
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10^n 。
示例:
输入: 2
输出: 91
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。
分析题目
先举个栗子
- n = 1
即 x∈[0 , 10)
x = 0 1 2 3 4 5 6 7 8 9(总共10个选择)
(一位数肯定不会出现相同的数字啦) - n = 2
即 x∈[0 , 100)
x为两位数 _ _
假如 第一位 取1 ==== 第二位可以取 2 3 4 5 6 7 8 9 0(总共9个选择)
第一位可以取 1 2 3 4 5 6 7 8 9(注意不能取0 总共9个选择)
个数 = 9 * 9 = 81
————总共 10 + 81 = 91 - n = 3
即 x∈[0 , 1000)
x为三位数 _ _
假如 第一位 取1 ==== 第二位可以取 2 3 4 5 6 7 8 9 0(总共9个选择)
假如 第二位 取2 ==== 第三位可以取 3 4 5 6 7 8 9 0(总共8个选择)
第一位可以取 1 2 3 4 5 6 7 8 9(注意不能取0 总共9个选择)
个数 = 9 * 9 * 8= 648
————总共 10 + 81 + 648= 739
…
以此类推
最后当x的位数超过10的时候肯定会出现重复数字
因此只要讨论10种情况
因为答主比较懒…所以…暴力大法好!(# ^ . ^ #)
代码如下:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if(n==0) return 1;
if (n == 1) return 10;
else if (n == 2) return 91;
else if (n == 3) return 9*9*8 + 91;
else if (n == 4) return 9*9*8*7 + 9*9*8 + 91;
else if (n == 5) return 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 6) return 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 7) return 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 8) return 9*9*8*7*6*5*4*3 + 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else if (n == 8) return 9*9*8*7*6*5*4*3*2 + 9*9*8*7*6*5*4*3 + 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
else return 9*9*8*7*6*5*4*3*2*1 + 9*9*8*7*6*5*4*3*2 + 9*9*8*7*6*5*4*3 + 9*9*8*7*6*5*4 + 9*9*8*7*6*5 + 9*9*8*7*6 + 9*9*8*7 + 9*9*8 + 91;
}
};