algorithm - 查找范围 [L, R] 中其二进制表示包含给定模式的所有数字
问题描述
令L 和R 代表两个正整数,那么我们需要找出[L,R] 中的所有数字,即L 和R,包括L 和R,它们的二进制表示形式为101。例如,让 L = 3 和 R = 20,那么 5(101) 和 13(1101) 就是两个这样的数字。
约束
1 <= L <= R <= 10^18
我的做法——
一种明显的方法是从 L 遍历到 R 并获得每个数字的二进制表示并检查它是否包含 101,但考虑到约束,这将花费太多时间。另一种方法可以使用数字动态规划,更正式地说,如果我们可以计算一个函数 F(x),其中 x 是一个非负整数,F(x) 表示小于或等于 x 的 +ve 整数个数,满足问题中给出的条件(即它的二进制表示包含 101),如果我们假设 F(0) = 0,那么问题简单地归结为 F(R) - F(L - 1)。我已经解决了一些数字 DP 问题,但无法制定这个问题,或者可能有其他方法?
解决方案
最简单的解决方案可能是将您的号码分成两部分 - 给定的模式和休息位。假设最大的数字是 5 位长,给定的模式是 3 - '101',所以剩下的部分是 2 位。然后枚举 2 位的所有变体并使用它们创建数字并与所有变体的目标模式连接 -
00 gives you '00 101' '0 101 0' '101 00'
01 gives you '01 101' '0 101 0' '101 01'
10 gives you '10 101' '1 101 0' '101 10'
11 gives you '11 101' '1 101 1' '101 11'
那么您只需消除重复项并限制范围。
推荐阅读
- processing - MouseX 一波
- javascript - 如果使用javascript选中了其他复选框,如何选中一个复选框?
- nlp - NLP : 患者医疗文本文件的错误/未知/拼写错误文本检测模型
- python-3.x - 当 python2 语句不再起作用时,在 python3 中打印一个 dict
- javascript - 表单提交发生两次(使用 jQuery 提示)
- html - 自定义高度导航栏的 Bootstrap 4 崩溃问题
- postgresql - PostgreSQL 错误 [42501]:错误:必须是关系表的所有者
- php - Discord webhook embed php curl 在最近的 Discord 更新后不再工作
- c# - 连接自引用的事件会导致内存泄漏吗?
- java - Java 类文件是否知道空格?