开启我的LeetCode刷题日记:357. 统计各位数字都不同的数字个数

107 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

进入题目: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;
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹