357. Count Numbers with Unique Digits

  不定期更新leetcode解题java答案。

  采用pick one的方式选择题目。

  给定非负整数n,求满足数字位数不超过n的整数,且各个位数字没有重复的数字个数。

  如:

  重复数字:“11”,“122”等。

  不重复数字:“0”,“12”,“123”等。

  简单的思路为依次添加数字,统计该次添加数字的可能情况,得出结果,这种方法不需要编写人的思考,运行时间十分长。

  具体代码如下:

 1 public class Solution {
 2     public int countNumbersWithUniqueDigits(int n) {
 3         return n == 0 ? 1 : 1 + getTotal(0, n, 0);
 4     }
 5     //逐次增加数字位数,递归的方式返回总数,可以看出递归会进行n次,运行时间十分长
 6     public int getTotal(int now, int n, int nextNum){
 7         int count = 0;
 8         if(now >= Math.pow(10, n - 1))
 9             return 0;
10         while(nextNum != 10){
11             int tmp = now * 10 + nextNum;
12             if(canAdd(now, nextNum)){
13                 count++;
14                 count += getTotal(tmp, n, 0);
15             }
16             nextNum++;    
17         }
18         return count;
19     }
20     //辅助函数,用来判断某个数字是否可以被添加到后一位,其中如果首位是0则不可添加0
21     public boolean canAdd(int now, int nextNum){
22         if(now == 0 && nextNum == 0)
23             return false;
24         int tmp = now;
25         while(tmp > 0){
26             int mod = tmp % 10;
27             if(mod == nextNum)
28                 return false;
29             tmp /= 10;
30         }
31         return true;
32     }
33 }

  当然, 我们分析过后,采用最直接的逻辑统计,对于首位数有9种可能,次位数有9种可能,之后依次减1,到10位数以后没有可能出现满足的数字。由此得出最简单直接的代码,具体如下:

 1 public class Solution {
 2     public int countNumbersWithUniqueDigits(int n) {
 3         int count = 1, total = 1;
 4         for(int i = 10; i > 10 - n; i--){
 5             if(i <= 0)
 6                 break;
 7             else if(i == 10)
 8                 count *= 9;
 9             else
10                 count *= i;
11             total += count;
12         }
13         return total;
14     }
15 }

 

posted @ 2016-11-06 23:27  zslhq~  阅读(186)  评论(0编辑  收藏  举报