2376. 统计特殊整数

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。

给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。

示例 1:

输入:n = 20
输出:19
解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。

示例 2:

输入:n = 5
输出:5
解释:1 到 5 所有整数都是特殊整数。

示例 3:

输入:n = 135
输出:110
解释:从 1 到 135 总共有 110 个整数是特殊整数。 不特殊的部分数字为:22 ,114 和131 。

提示:

1 <= n <= 2 * 1e9

分析:

  • 采用数位dp方式,之所以可以采用dp方式,是由于在组合数字过程中会出现重复现象(并不是相同的数字,是等价的数字)例如:n=53241;52*** ,51***这时就是等价情况,52,51都是已经消除了限制,后边的三个数存在的情况一样,因此可以使用dp;
  • 限制是什么意思?52 ,51都是已经消除了限制,后边的数可以任意组合,但是53***没有消除限制,第三位必须为2或者4数字,也就是说,如果在某位已经消除限制,后边数字组合就是等价的
  • 通过mask判断数字是否使用过:最多数字为10位(0-9),1<<10得到100,0000,0000,每一位表示一个数字。如果2已经使用,mask变为100,0000,0010(将第二位变为1)。
  • 位运算技巧:将某位(假设为d位)变为1,先得到一个d位为1的数,也就是1<<d,然后将两个数或运算,或运算不改变其他位(1|0=1,0|0=0),同时可以将第d位更改为1;
  • 位运算技巧:将某位(假设为d位)变为0,先得到一个d位为1的数,也就是1<<d,然后将两个数异或运算,与0的异或运算不改变其他位(1^0=1,0^0=0),同时可以将第d位原来位1就能更改为0;
  • 位运算技巧:查看某一位(假设为d位),首先将数右移d位,将第d位移到最后一位,然后&1(除了第一位其他位全为0,0001&1111=0001),如果原来结果为1,则与的结果为1,如果原来结果为0,则0&1=0;

code:

class Solution {public:int countSpecialNumbers(int n) {auto s = to_string(n);int m = s.length(), dp[m][1 << 10];memset(dp, -1, sizeof(dp));// 记忆化搜索function<int(int, int, bool, bool)> f = [&](int i, int mask, bool is_limit, bool is_num) -> int {if (i == m) return is_num;if (!is_limit && is_num && dp[i][mask] >= 0) return dp[i][mask];int res = 0;if (!is_num) res = f(i + 1, mask, false, false); // 可以跳过当前数位// 1 - is_num 表示如果前边已经出现数字,is_num=true ,可以从0枚举;如果不是数字则从1枚举// up = is_limit ? s[i] - '0' : 9; 如果前边的数字都和最大值n的数字相同,下一位的最大值应该为第i位数字for (int d = 1 - is_num, up = is_limit ? s[i] - '0' : 9; d <= up; ++d) // 枚举要填入的数字 dif ((mask >> d & 1) == 0) // d 不在 mask 中res += f(i + 1, mask | (1 << d), is_limit && d == up, true);// 有限制时应该到限制位之后才能记忆,//并且前边应该有数字才能记忆,如果前边没有数字用不到这个记忆// 能用到记忆的情况:n=54321;52341 52***这时能用到记忆,记忆的是前边数字一样,顺序不同,限制已经消除的情况// 0002,前边i位都为0只会出现一次,因此不用记忆。if (!is_limit && is_num) dp[i][mask] = res;return res;};return f(0, 0, true, false);}
};

代码来源:leetcode
视频链接:视频讲解

2376. 统计特殊整数--(每日一难phase2--day4)相关推荐

  1. 统计在线人数、每日访问人数和总人数

    统计在线人数.每日访问人数和总人数 这个程序难一点,特点在于,因为他是分别的传送每个图片,所以不像CGI产生的图片那样大.而且图片可以重复的利用所以较率高速度快.只是没有JavaScript就不行了. ...

  2. python整数类型在每一台计算机上的取值范围是一样的_关于python统计一个整数列表中不同数值种类数的问题。...

    下面这段代码中,kind_num用于统计那个整数列表中有几种不同数值的整数. class Solution(object): def distributeCandies(self, candies): ...

  3. 每日长难句打卡Day23

    每日长难句打卡Day23 参考译文:特别是,他们呼吁与西部各州政府(通常不满联邦政府的行动)以及私人土地所有者(控制着约95%的草原榛鸡栖息地)形成更紧密的合作关系.

  4. 每日长难句打卡Day22

    每日长难句打卡Day22 好久不见,王同学回来了,以后还是坚持每日一句吧,不能偷懒!!! 参考译文:学生在进入大学之前也会从一些有关编码的知识中获益,因为在大学里,计算机科学入门课程都排得满满当当,这 ...

  5. 句句真研—每日长难句打卡Day21

    句句真研-每日长难句打卡Day21 参考译文:"少即是多"这句话实际上是首先由一位名叫路德维希●密斯凡德罗的德国建筑家推广开来的,像其他与包豪斯建筑学院相关的设计师一样,他在二战之 ...

  6. 句句真研—每日长难句打卡Day20

    句句真研-每日长难句打卡Day20 参考译文:我们往往将二战结束后的几十年看做是一个繁荣与增长的时代,数以百万的士兵们返回家乡,他们在<退伍军人权利法案>的帮助下去上大学,在婚姻登记处排队 ...

  7. 句句真研—每日长难句打卡Day19

    句句真研-每日长难句打卡Day19 参考译文:这场席卷整个新闻编辑部的旋风伤及每个人,但大部分损失集中于报纸内容最缺乏特色的部门

  8. 句句真研—每日长难句打卡Day18

    句句真研-每日长难句打卡Day18 参考译文:但研究者认为,如果外部董事在坏消息爆发前就已离开公司,那么他们会更容易避免声誉受损,即便历史记录显示'"错误行为形成时,董事们尚在其职" ...

  9. 句句真研—每日长难句打卡Day17

    句句真研-每日长难句打卡Day17 补九月三号 参考译文:他们发现,(董事)突然离职后,其所在公司随后需要重申盈利的可能性增加了近20%.

  10. 句句真研—每日长难句打卡Day16

    句句真研-每日长难句打卡Day16 补九月二号 参考译文:那些回应称"音乐录音无法替代现场演出"的音乐会忠实听众没有真正抓住核心问题.

最新文章

  1. 提高智能家居设备的兼容性
  2. Nature综述带你读懂微生物在氮循环中的作用
  3. 关于iframe中session 失效问题
  4. Apache Jmeter 压测入门
  5. 解决Python中字典出现“TypeError: 'dict_keys' object does not support indexing”错误
  6. VC++ 获得程序运行根目录 汇编源码
  7. 华为屏下前置摄像头专利曝光:消灭刘海
  8. 用上了Godaddy的美国主机
  9. win10+android+手机驱动,win10系统电脑没有手机驱动的解决方法
  10. JavaWeb房屋租赁管理系统(servlet+jsp+mysql)
  11. acad.exe 中的 0x25c70fc2 (???.arx) 处最可能的异常: 0xC0000005: 读取位置 0x0000009c 时发生访问冲突
  12. C语言show用法,show的用法和例句
  13. Oracle随机抽样sample使用说明
  14. Google Adsense通过西联快汇收取收入的详细步骤
  15. 开个新栏目,起个恬淡的名字
  16. 666666666666.com路路解密破解游戏第一部23题攻略
  17. 菜菜包:赛场荣耀的背后,刻着 0 到 1 的执着
  18. ISO20000 IT服务管理要点
  19. Python编程题——根据是否为会员以及购物的金额进行打折
  20. php 合计,PHP实时统计中文字数和区别

热门文章

  1. 小米笔记本linux双系统安装,小米笔记本电脑系统安装教程
  2. axure网页预览_解决Axure发布分享预览的3个方法
  3. 360随身wifi+Wireshark 对手机应用抓包
  4. 数字电子技术第二章--逻辑代数与逻辑函数化简
  5. 黑客帝国1-3 1080P 35.9G 下载
  6. Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着
  7. Django Ajax文件下载
  8. 网格划分——Mesh操作
  9. 十大开源安全测试工具
  10. 在Windows 10 增加和使用英语语音包