在以下情况下进行位计数

时间:2011-12-10 15:21:55

标签: c++

我在其中一个访谈中得到了以下问题,请帮我解决一些问题,因为我完全不知道如何继续进行

N个元素的非空数组A包含非负整数K的八进制表示,即A的每个元素属于区间[0; 7]

写一个函数:

int bitcount_in_big_octal(const vector<int> &A);

返回K的二进制表示中设置为1的位数。如果设置为1的位数超过10,000,000,则该函数应返回-1。

假设数组可能非常大。

假设N是[1..100,000]范围内的整数。

3 个答案:

答案 0 :(得分:2)

有时间限制吗? 我有一个想法:首先,制作以下字典,{0-> 0,1-> 1,2-> 1,3-> 2,4-> 1,5-> 1,6-> 2,7-> 3}。然后,循环数组A,使用字典对每个元素中的1进行求和。

答案 1 :(得分:0)

  1. 迭代你的陈述
  2. for-iterate中的每个元素,将表示转换为其位数。 @ meteorgan的回答是一个很好的方法。如果您需要除位数之外的其他内容的表示,您可能希望将其转换为某些中间形式,这些中间形式对于您将使用的任何其他内容都很有用 - 例如到byte[]:表示中的每个八位字节应该对应一个byte,因为你所做的只是计数位,所以Java的字节是有符号的。然后,对于数组中的每个byte,使用现有的位计数lib,将byte强制转换为int并使用Integer.bitCount(...),或者滚动自己的位数等 - 计算位数
  3. 将结果添加到运行总计中,如果达到阈值则转义迭代。
  4. 这是细节中的Java答案(比如我链接的lib),但算法步骤适用于C ++,找到替换库(或使用字典答案)。

答案 2 :(得分:0)

这是使用基于索引(字典)的方法的解决方案。

INDEX = [0, 1, 1, 2, 1, 2, 2, 3]

def bitcount_in_big_octal(A):
    counter = 0
    for octal in A: counter += INDEX[octal]
    return counter