【刷题日记】357. 统计各位数字都不同的数字个数

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

【刷题日记】357. 统计各位数字都不同的数字个数

本次刷题日记的第 30 篇,力扣题为:357. 统计各位数字都不同的数字个数中等

一、题目描述:

兄弟们,今天查漏洞有点晚,回来继续刷题,还好早上看过这道题,已经有了一定的思路,现在就来瞅瞅吧

二、这道题考察了什么思想?你的思路是什么?

这道题题目信息比较明确,内容也比较少,就是题目给出一个具体的范围,左闭右开区间,找出该范围中每个位上数字不同数字的种类和

这个数字的范围最大是 10 的 8 次方,也就是 1 后面有 8 个 0

题目明确,乍一看,好像思路不太明确哈,一时间可能还拿不住

没事,我们可以来推理一下,就明白了,这个其实是一个数学题,还记得咱们在高中还是初中的时候,就解过这样的数学题

那么我们同理就可以得出

n = 3 的时候,3 位数的时候,符合条件的就有 9*9*8 = 648 种 种,再加上前面的 91 种,那么就是 739 种

这样子,我们可以可以明白,其实这就是一个数学题,一个排列组合的题目

这下子这个数学题就可以接出来了吧,接下来我们就可以按照思路来翻译代码了

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,这里需要注意我们要清楚,对于多位的时候,需要注意每一个位上面可以出现不同数字的种数

编码如下:

func countNumbersWithUniqueDigits(n int) int {
    if n == 0 {
        return 1
    }
    if n == 1 {
        return 10
    }
    // 初始化好当 n等于 1 的时候,结果是 10中,并且当前的 1 位数的时候,符合条件的种数是 9,因为 0-9 中,第 1 位 不能是 0 开头
    res, cur := 10, 9
    for i := 0; i < n-1; i++ {
        // 第 1 位数,有 9 种,第 2 位有 9 种, 第 3 位 有 8 种,以此类推
        cur *= 9 - i
        res += cur
    }
    return res
}
复制代码

四、总结:

这题代码量比较少,时间复杂度咱们不难看出,就是 O(n) ,循环的次数是 n-1 次,此处的空间复杂度是 O(1) ,我们引入的是常数级别的空间消耗

原题地址:357. 统计各位数字都不同的数字个数

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

猜你喜欢

转载自juejin.im/post/7085361575556546590