题意:
给定一个整数,返回0到10的n次方中每个位都不等的数的个数。
分析:
即我们要找出存在相等位的数的个数(比如1234567891)有两个1。我们发现这样的数1位数有10个(0到9)。2位数是有9*9个(第一位即十位有9种选择(1-9),第二位有0-9除去第一位已经确定的有9种,所以总共9*9=81种)。依次类推,按照排列组合的思想,3位数是9*9*8个,4位数是9*9*8*7个,直到10位数及以上是0,因为0-9九个数字必定有重复。
我们来考虑一般规律和特殊情况:
特殊情况1:n == 0的时候返回1.后面发现正好是count的初始值,直接返回即可,所以不用特殊处理。
特殊情况2:n>=10的时候阶段性的和是0,考虑在循环中到0的时候处理
特殊情况3:9*9*8,9乘了一次9才变成8,考虑在循环中到9的时候处理
public class Solution {
public int countNumbersWithUniqueDigits(int n) {
int count = 1;
int m = 9; //排列组合的每一位的排法
int t = 1; //每n位数的阶段性的和
while(n > 0){
t *= m;
count += t;
n--;
if(t != 9 && t!=0) //对特殊情况2,3的处理
m--;
}
return count;
}
}