一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode
刷题之旅
第一阶段目标是:200
道,每天1
到2
篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
进入题目:357. 统计各位数字都不同的数字个数
给你一个整数 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
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
写几个例子寻找一些一般公式:
- n = 0, 0 <= x < 1, [0] 1种
- n = 1, 0 <= x < 10, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 10种
- n = 2, 0 <= x < 100, 数字包含两部分之和,一部分为 n = 1 的所有10个答案(一位数),另一部分为长度为 2 的新增数字。即是 10 + 99 个新增数字
- n = 3,0 <= x < 1000, 10 + 99 + 998 = 739
- 此时可以推导出此处排列的一般公式:n = d(2<=d<=8), 小于d位数的数字个数 + 9*P(9,d-1)。
代码实现
var countNumbersWithUniqueDigits = function (n) {
if (n === 0) return 1;
if (n === 1) return 10;
let count = 10, inc = 9;
for (let i = 0; i < n - 1; i++) {
inc *= 9 - i;
count += inc;
}
return count;
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹