假设您有一个包含设置位索引的数组,用于非常大的数字(最多10000位,不能用基本类型表示)。示例:array:[0,2,3,6,10]对应于10001001101。
换句话说:num = pow(A [0])+ pow(A [1])+ .... + pow(A [n-1]),其中pow(x)= 2 X
现在假设您有一个数字K = 3 * num。
如何找到K中设置的位数?
我相信可以在O(n)中完成,其中n是数组中元素的数量。
我的想法是迭代数组中的项目,模拟数字和自身向左移动1位置之间的加法。但是,我无法找到一个干净的逻辑。
答案 0 :(得分:1)
从LSB工作到MSB,你有运行的设置位,由清零位运行分隔:间隙。
(没有随身携带),每个单1
将转变为11
- 在之前有零的地方“更重要1
”:无进行。
如果将10
添加到较长的1
s并清除最低有效位,则得到原始数字三倍的二进制表示 - 具有完全相同的位数组。还有一个1
,其中可能是下一个,错误,一个以及1
:执行。任何进位都会被吸收:它只是“交换”两个最低有效位
如果11
代表单个1
的三倍,则进位会导致执行 - 并清除两位(尝试使用{{ 1}} * 3)。
比一个“吸收”的差距更长
使用 O(n)算法以升序,预先输入或使我惊讶输入索引。我很想用标签编写状态机
当我练习python时:
101011
答案 1 :(得分:0)
从这个测试:
我观察:
N = 11是一个复杂的例子。详情: