一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
统计各位数字都不同的数字个数
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
这道题目基本上就是数学题,掰手指估计都能算出来。
题目提供素材
本道题目提供的素材很精炼,只有一个整数变量n。
注:没有那么多的提示,只有一个n的参数范围:[0,8]。
我的解读
一个整数,要保证每一位数字都不一样,才能被统计下来。
比如:12,13;而11就不行。
再比如1,2,3都符合这个标准。
解题思路
我在看到这道题的时候,其实是没什么思路的,脑袋里面一团浆糊。
暴力美学好像也不太好,那可能是要遍历千万次才能得到最终的结果。
只有看看大佬们写的代码,在一番粘贴复制之后,我好像明白了。
大概有这么几个稍微费脑子的步骤,搞清这几个,保证你数学不及格也能想明白写出来。
-
排除n=0,n=1的情况,这两种情况都能直接判断出来相应的符合规则的数量。这里我觉得可以直接将n=2也排除掉,因为n=2时,无非也就是那么几个特殊值,更何况例子里面都给出来了。
-
当n>2时,那么就出现了另外一种特殊情况,比如122,233,455等等不符合规则的数字,那么要想排除这些数字其实并不容易,要循环很多次的。
我们主要是要解决第二步的,既然无法通过常规方法一个个的去判断,那么就换个思路。
去反向考虑,直接计算出几个数字能拼出多少个符合规则的数字。
就比如,1,2,3;可以拼成123,213,321,312等等,这样通过循环的方式就可以计算出来了。
代码
具体执行代码如下:
class Solution {
public int countNumbersWithUniqueDigits(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 10;
}
int resultNum = 10;
int cur = 9;
for (int i = 0; i < n - 1; i++) {
cur = cur * (9 - i);
resultNum += cur;
}
return resultNum;
}
}
另一个方案
我看到一个大佬直接就把n=1到n=8的结果算出来了,直接就拿出来,感觉这个逻辑也非常棒,毕竟这种情况人力算也很快。
如果是真实的场景,也不用每次都去计算。
代码如下:
class Solution {
public int countNumbersWithUniqueDigits(int n) {
return new int[]{1,10,91,739,5275,32491,168571,712891,2345851}[n];
}
}
执行结果
执行结果如下图所示: