leetcode_middle_13_357. Count Numbers with Unique Digits

来源:互联网 发布:mastercam车铣复合编程 编辑:程序博客网 时间:2024/06/10 21:17

题意:

给定一个整数,返回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;    }}





0 0