为3 * num设置的位数,具有列表o设置num的位位置

时间:2016-11-20 22:49:21

标签: algorithm

假设您有一个包含设置位索引的数组,用于非常大的数字(最多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位置之间的加法。但是,我无法找到一个干净的逻辑。

2 个答案:

答案 0 :(得分:1)

从LSB工作到MSB,你有运行的设置位,由清零位运行分隔:间隙
(没有随身携带),每个单1将转变为11 - 在之前有零的地方“更重要1”:无进行
如果将10添加到较长的1 s并清除最低有效位,则得到原始数字三倍的二进制表示 - 具有完全相同的位数组。还有一个1,其中可能是下一个,错误,一个以及1执行。任何进位都会被吸收:它只是“交换”两个最低有效位 如果11代表单个1的三倍,则进位会导致执行 - 并清除两位(尝试使用{{ 1}} * 3)。
比一个“吸收”的差距更长 使用 O(n)算法以升序,预先输入或使我惊讶输入索引。我很想用标签编写状态机 当我练习python时:

101011

答案 1 :(得分:0)

从这个测试:

enter image description here

我观察:

  1. 如果sizeof(arrN)== 1,则sizeof(arrRes)= 2
  2. 如果' v'存在于arrN和arr2N中,然后消除它并重复使用' v + 1'直到' v + x'不存在或是最后的价值。然后增加' v + x'。 示例N = 3:' 1'存在于两者中,消除; ' 2'只在一个,但是最后;增量' 2'。
  3. 应用2之后)如果arrN中存在值,但arr2N中不存在,那么它将存在于arrRes中,大小将为++ 1。对于arr2N中的值而不是arrN中的值也是如此。示例N = 9。
  4. N = 11是一个复杂的例子。详情:

    1. ' 0'在arrN中,而不是在arr2N中,所以放入arrRes。
    2. ' 1'同时;跳过' 1'并且测试1 + 1 = 2。
    3. ' 2'在两者中(嗯,真的只在arr2N中,我们建立了假的' 2'来自 另一个arr),跳过并测试' 3'。
    4. ' 3'内置arr2N存在于arrN中。跳过并测试' 4'。
    5. ' 4'存在是最后的。增加它。
    6. 最终结果[0,5]:' 0'从第1步和第5步'从第5步开始