如果您有足够的内存来处理,高效计算一个数字的二进制表示中1的数量的方法是O(1)。这是我在一个在线论坛上找到的面试问题,但没有答案。有人能提供一些建议吗?我无法想出如何在O(1)时间内完成。
如果您有足够的内存来处理,高效计算一个数字的二进制表示中1的数量的方法是O(1)。这是我在一个在线论坛上找到的面试问题,但没有答案。有人能提供一些建议吗?我无法想出如何在O(1)时间内完成。
0b1111011.toString(2).split(/0|(?=.)/).length // returns 6
或者
0b1111011.toString(2).replace("0","").length // returns 6
public static int findOnes(int number)
{
if(number < 2)
{
if(number == 1)
{
count ++;
}
else
{
return 0;
}
}
value = number % 2;
if(number != 1 && value == 1)
count ++;
number /= 2;
findOnes(number);
return count;
}
我来到这里,怀着一种强烈的信念,认为我知道这个问题的美丽解决方案。C语言代码:
short numberOfOnes(unsigned int d) {
short count = 0;
for (; (d != 0); d &= (d - 1))
++count;
return count;
}
popcnt
。(在this answer中提到)private static int countBits(int number) {
int result = 0;
while(number != 0) {
result += number & 1;
number = number >>> 1;
}
return result;
}
但是,像-1这样的数字在二进制中表示为11111111111111111111111111111111,因此需要进行大量移位。如果您不想对小负数进行如此多的移位,另一种方法是:
private static int countBits(int number) {
boolean negFlag = false;
if(number < 0) {
negFlag = true;
number = ~number;
}
int result = 0;
while(number != 0) {
result += number & 1;
number = number >> 1;
}
return negFlag? (32-result): result;
}
Ruby实现
def find_consecutive_1(n)
num = n.to_s(2)
arr = num.split("")
counter = 0
max = 0
arr.each do |x|
if x.to_i==1
counter +=1
else
max = counter if counter > max
counter = 0
end
max = counter if counter > max
end
max
end
puts find_consecutive_1(439)
我不得不在Ruby中进行高尔夫比赛,最终得到了这个结果
l=->x{x.to_s(2).count ?1}
用法:
l[2**32-1] # 返回32
显然不是很高效,但能解决问题 :)
def countOnes(num):
return bin(num).count('1')
我只能想到一种在O(1)时间内完成此任务的方法...那就是“作弊”,使用物理设备(使用线性或甚至并行编程,我认为极限是O(log(k)),其中k表示数字的字节数)。
但是,你可以很容易地想象出一个物理设备,将每个位连接到输出线上,带有0/1电压。然后,您可以仅在O(1)时间内在“求和”线上电子读取总电压。使用一些基本电路元件可以使这个基本想法更加优雅,以产生您想要的任何形式的输出(例如二进制编码输出),但基本思想是相同的,电子电路将在固定时间内产生正确的输出状态。
我想象中也有可能的量子计算机方案,但如果我们被允许这样做,我认为一个简单的电子电路是更容易的解决方案。
我实际上使用了一些巧妙的手法来完成这个:一个只有16个条目的查找表就足够了,你所要做的就是将二进制表示分成四位元组。复杂度实际上是O(1),我编写了一个C++模板,它专门针对您想要的整数大小(以#位为单位)进行了优化...使其成为常量表达式而不是不确定的。
顺便说一句,您可以利用(i&-i)将返回LS一位比特的事实,并简单地循环,每次剥离lsbit,直到整数为零-但这是一个旧的奇偶校验技巧。
function getBinaryValue(num){
return num.toString(2);
}
function checkOnces(binaryValue){
return binaryValue.toString().replace(/0/g, "").length;
}
其中 binaryValue 是二进制字符串,例如:1100