一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
一、题目描述:
给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10n 。
示例 1:
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
示例 2:
输入:n = 0 输出:1
提示:
0 <= n <= 8 通过次数52,352提交次数
来源:力扣(LeetCode)
题目链接:leetcode-cn.com/problems/co…
思路分析
首先明确 :为第一位数不能取0,所以第一位数只有9个数,第二位数可以取0,故第二位数可以有十个数,但是第二位数不能和第一位相同,所以也只有九个,我们初始化第一位数取9个数,从第二位数开始,i表示已经取了几位数(不包括取当前的位置),
两种边界情况:
当 n = 0时,0 ≤x<1,xx 只有 1种选择,即 0。
当 n = 1时, 0≤x<10,xx 有 10 种选择,即 0∼9。
依次往后推。可以知道,在第一位确定的情况下,第二位为了和第一位的数不同,可能的取值要去掉第一位取的值,则第二位可能的取值个数减一,有九种情况。第三位同理,要减去第一位和第二位的数,有八种情况。其他位也是如此
利用乘法原理,每位数可选的数值个数相乘即是长度为 n 的数的可能方案数 cur,而所有长度 [1,n] 的方案数累加即是答案。
三、AC代码
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) return 1;
int ans = 10;
for (int i = 2, last = 9; i <= n; i++) {
int cur = last * (10 - i + 1);
ans += cur; last = cur;
}
return ans;
}
}
四、总结:
掘友们,解题不易,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐