今日中等题:https://leetcode-cn.com/problems/count-numbers-with-unique-digits/
一开始思路偏了,看到数字基数比较大,默认想从数量少的开始,就是先统计有重复位数的数字,后来发现这种方式,很容易有重复,而且一旦n的数量增加,会变得非常复杂。
所以换了个思维,直接统计不重复的数,会发现出了特殊的边缘值需要单独返回,100及以上的数的计算方式已经固定了:
- 首位不能为0,因此只有9种选择;
- 第二位开始可以选择的数字个数逐层减1;
- 因为0 <= n <= 8,所以不需要考虑没有数字可选的情况。
综上,看下代码吧,今天的思路和题解基本一致:
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if (n==0) {return 1;}
if (n==1) {return 10;}
int ans = 10;
int cur = 9;
// 每增加1位数,可选数字范围比之前少1
for (int i = 2; i <= n; i++) {
cur = cur * (10-i+1);
ans +=cur;
}
return ans;
}
}
网友评论