每日算法系列【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]

后记

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

相关文章
|
1月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
59 0
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
9天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
30天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
23 2
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
57 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
2月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
50 6
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
59 1