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 }