计算各个位数不同的数字个数

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中选择有9
    98种,当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(计算各个位数不同的数字个数)

357 Count Numbers with Unique Digits 计算各个位数不同的数字个数

C语言中如何将一个数字的各个位上的数分别提取?

python怎么求阶乘

JS实现计算任意一个数的各个位数的和