计算各个位数不同的数字个数
Posted 超浪*牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算各个位数不同的数字个数相关的知识,希望对你有一定的参考价值。
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10^n 。
示例:
输入: 2
输出: 91
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。
- 思想:拿到算法题,别想一口吃个大胖子的想法来,首先分析题目要求,找规律,等吧大问题切成最简单的小块,要是还是不会,就在往小了细分!!!
- 解析:其实这道题分析到最后很简单,只要懂点排列组合OK,那么我们来分析:
当n=1时,也就是只有一位数,选择的数字只有0~9;都不重复,那它返回的值就是10;
当n=2时,两位数10~99,首先可以知道十位数字不可能是0,那十位数上的x就只能有1 ~ 9这九位数,为了和题目保持一致x!=y,那么个位数y就有9个选择,那它就有99种再加上前面的10返回91;
同理:当n=3的时候从100-999中选择有998种,当n=4的时候从1000-9999中选择有9987种,所以规律很好发现。 - 代码实现
/*代码简单,思路清晰*/
int SUM(int n){
if(n == 0){
return 0;
}//当是0个数位的时候返回零
int result = 10;//当n=1时,一位数时有10个符合条件
int data = 9;
int num = 9;
while(n>1){
data *= num;
result += data;
n--;
num--;
}
return result;
}
明白了这点,代码就容易理解多了,我们还可以再来修改一下
/*java 熟悉一下,快忘了,但是算法和语言没多大关系,
看熟悉程度选择*而已*/
static int count(int n) {
int[] res = new int[n+1];
res[0] = 1;
int sum = 1;
int k = 9;
for(int i=1;i<=n&&k>0;i++) {
if(i==1) {
res[i] += res[i-1]*9;
}else {
res[i] += res[i-1]*k--;
}
sum += res[i];
}
return sum;
}
思路一样,多加一个数组而已。
以上是关于计算各个位数不同的数字个数的主要内容,如果未能解决你的问题,请参考以下文章
LeetcodeCount Numbers with Unique Digits(计算各个位数不同的数字个数)