码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 经典算法:不大于N的特殊数字


    • 经典算法:不大于N的特殊数字
      • 1. 题目描述
      • 2. 算法思路
      • 3. 代码实现

    1. 题目描述

    这个题目其实来自于Leetcode的以下两道题目:

    1. 1012. Numbers With Repeated Digits
    2. 2376. Count Special Integers

    问题的主体就是,给出一个确定的整数 n n n,求取所有不大于 n n n的,且各个位数都不相同的数的个数。

    或者相反,求出存在至少有两位数字相同的数字的个数,不过这两个问题是互补的,所以我们只需要考虑上一个问题即可。

    2. 算法思路

    这一题的算法思路算是一个相对复杂一点的分类讨论:

    1. 首先,如果生成的数字位数小于 n n n,那事实上就是一个简单的排列组合问题,除了首数字不能为 0 0 0之外,就没有什么特殊情况了;
    2. 然后要考虑一下位数相同的情况,此时又需要分两类进行考察
      1. 首先是第一位比目标数小的情况,此时后面就是一个完全的排列问题,还是比较好处理的;
      2. 然后就是临界情况,即第一位与目标值相同的情况,此时我们就需要考察第二位的情况,然后此时就又一次回到了这一段开头的情况。
    3. 另外还有一个比较特殊的情况就是如果这个数存在两个位数是相同的情况下,此时跳出循环即可。

    3. 代码实现

    具体到实现上,我们摘录某位大佬的代码实现如下:

    class Solution:
        def countSpecialNumbers(self, n: int) -> int:
            nums = [int(i) for i in str(n+1)] 
            d = len(nums) 
            res = 0 
            
           
            for i in range(1,d):
                res += 9 * math.perm(9,i-1)
            
    		
            for i, x in enumerate(nums):
                if i == 0:
                    digit_range = range(1,x) 
                else:
                    digit_range = range(x)
                    
                for y in digit_range:
                    if y not in nums[:i]:
                        res += math.perm(9-i,d-1-i)
                if x in nums[:i]: break
                    
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    C++中类和动态内存分配
    java spring cloud 企业工程管理系统源码+二次开发+定制化服务
    外包干了2个月,技术退步明显...
    Hiding Images within Images[精读]
    ArrayList集合中元素的排序
    问题 F: 逆序排列 两种方法
    滑动窗口分位数
    Dubbo:Nacos作为注册中心
    vue封装自己的组件库 01.封装button组件
    vue3 更换 elemnt-ui / element-plus 版本npm命令
  • 原文地址:https://blog.csdn.net/codename_cys/article/details/126335292
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号