每日算法系列【LeetCode 357】计算各个位数不同的数字个数

简介: 每日算法系列【LeetCode 357】计算各个位数不同的数字个数

题目描述

给定一个非负整数 n ,计算各位数字都不同的数字 x 的个数,其中  。

示例1


输入:2输出:91解释:答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

题解

这题要求所有数位数字都不相同的数字个数,那么我们可以将答案分成不同长度。

方法1

对于长度为 n 的数字,第一位取值有 1~9 一共 9 种情况,而后面 n - 1 位可以从 0~9 中随机取出 n - 1 个不同数字,然后随机排列。因为要和第一位不同,所以后面的数字选择只有 9 种情况,所以方案数是排列数 。

然后一直累和到长度为 1 的数字,最后还有个特例,就是 0 ,它是首位可以为 0 的唯一情况。

所以最终答案就是  。具体实现的时候可以将阶乘预处理好,然后直接用就行了。

方法2

因为 n 不会太大,所以我们可以本地将每个 n 对应的答案算出来,然后保存到数组里,提交的时候直接取答案就行了。这种方法非常投机取巧,适合直接做会超时,但是答案数量又不是太多的情况。

代码

方法1(c++)


class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
       int fact[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
       int res = 0;
       for (int i = 10-n; i <= 9; ++i) {
           res += fact[9] / fact[i];
       }
       return res * 9 + 1;
    }
};

方法1(python)

class Solution:
    def countNumbersWithUniqueDigits(self, n: int) -> int:
        fact = [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
        res = 0
        for i in range(10-n, 10):
            res += int(fact[9] / fact[i])
        return res * 9 + 1

方法2(c++)

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
       int res[] = {1, 10, 91, 739, 5275, 32491, 168571, 712891, 2345851, 5611771};
       return res[n];
    }
};

方法2(python)

class Solution:
    def countNumbersWithUniqueDigits(self, n: int) -> int:
        res = [1, 10, 91, 739, 5275, 32491, 168571, 712891, 2345851, 5611771]
        return res[n]

后记

这题还可以用递归、解出和式的通式等方法求解,本质上没有太大区别。

相关文章
|
7天前
|
机器学习/深度学习 算法
**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。
【6月更文挑战第28天】**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。数据从输入层流经隐藏层到输出层,计算预测值。接着,比较预测与真实值计算损失。然后,从输出层开始,利用链式法则反向计算误差和梯度,更新权重以减小损失。此过程迭代进行,直到损失收敛或达到训练次数,优化模型性能。反向传播实现了自动微分,使模型能适应训练数据并泛化到新数据。
19 2
|
18天前
|
算法 Java
[Java·算法·简单] LeetCode 283. 移动零
[Java·算法·简单] LeetCode 283. 移动零
19 2
|
18天前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
16 2
|
21天前
|
存储 算法 调度
力扣中级算法(Python)
力扣中级算法(Python)
|
21天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
21天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
8天前
|
机器学习/深度学习 自然语言处理 算法
心得经验总结:机器翻译评测——BLEU算法详解(新增在线计算BLEU分值)
心得经验总结:机器翻译评测——BLEU算法详解(新增在线计算BLEU分值)
11 0
|
22天前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
22天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
22天前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)