题目描述

给定一个非负整数 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 = 0for 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]

后记

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

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

  1. LeetCode 357. 计算各个位数不同的数字个数(DP)

    1. 题目 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n. 示例: 输入: 2 输出: 91 解释: 答案应为除去 11,22,33,44,55,66 ...

  2. LeetCode 357. 计算各个位数不同的数字个数(动态规划)

    题目描述 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答案应为除去 11,22,33,44,55,66 ...

  3. leetcode 357. Count Numbers with Unique Digits | 357. 计算各个位数不同的数字个数(Java)

    题目 https://leetcode.com/problems/count-numbers-with-unique-digits/ 题解 只要认真分析数字特点,这题不难,就是个带一些条件的排列组合. ...

  4. leetcode算法题--计算各个位数不同的数字个数

    原题链接:https://leetcode-cn.com/problems/count-numbers-with-unique-digits/ 动态规划: dp[0] = 1 dp[1] = 9(原因 ...

  5. leetcode357. 计算各个位数不同的数字个数(回溯)

    给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n .示例:输入: 2 输出: 91 解释: 答案应为除去 11,22,33,44,55,66,77,88, ...

  6. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  7. LeetCode 315. 计算右侧小于当前元素的个数(Count of Smaller Numbers After Self)

    题目描述: 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  8. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  9. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  10. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

最新文章

  1. 著名物理学家斯蒂芬•霍金去世,他曾告诫人类要学会避免人工智能可能的风险
  2. AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票
  3. 推荐高质量的公众号,值得跟进学习!
  4. .netframework游戏编程入门——模拟魔兽学院永远的羁绊
  5. 第55章、播放视频(从零开始学Android)
  6. Python数据分析(4):jieba分词详解
  7. KALI 2020 软件集成清单——逆向工程(七)
  8. ChinaITLab Linux实战工程师网校课程-8CD
  9. java砍价源码_(JAVA)仿拼多多砍价算法
  10. Java写入txt文件内容
  11. 计算机打印设置方法,针式打印机设置教程详解,小编教你针式打印机设置共享/纸张大小方法...
  12. 根据xml配置地图服务
  13. 计算鬼成像学习笔记一:简介
  14. K210人脸识别+RFID录入信息
  15. ZOJ 2965 Accurately Say quot;CocaColaquot;!
  16. Type C连接器中的56k欧姆电阻及电容其实很关键!
  17. 创新塑造极致经典,施耐德电气发布新一代模块化UPS Galaxy PX
  18. 钢铁行业,煤炭行业,有色金属行业的历史利润,负债率
  19. 山东大学软件项目管理
  20. Delphi中ActionList组件在菜单编制中的应用

热门文章

  1. 国内10大广告联盟各自有哪些优势?
  2. 悲剧,当用cywin 写Linux脚本
  3. 【sampleDateFormat】对日期进行解析
  4. 白鹭引擎 - 事件机制 ( Event, addEventListener, dispatchEvent )
  5. SQL SERVER 查找某个字符在字符串中出现的次数
  6. [Leetcode] spiral matrix ii 螺旋矩阵
  7. 用Python自动发送邮件
  8. PE文件格式详解(下)
  9. [导入]ASP.NET重用代码技术 - 用户控件技术
  10. mysql行级锁 select for update