我有一个循环,用于计算两个琴弦之间的总汉明距离。
对于输入:
nums = [4,14,2]
循环的一个版本:
n, ans = len(nums), 0
for i in range(32):
bit, cnt = 1<<i, 0
for num in nums:
cnt += num & bit
ans += cnt * (n-cnt)
return ans
给出错误的结果:-84
几乎相同的循环:
n, ans = len(nums), 0
for i in range(32):
bit, cnt = 1<<i, 0
for num in nums:
cnt += (num & bit) > 0
ans += cnt * (n-cnt)
return ans
给出正确答案6.我能弄清楚为什么?
第二个循环中的“> 0”有什么作用?我试图通过一个简单的测试来了解它的作用:
>>> i = -5
>>> i += 1
>>> i
-4
>>> i = -5
>>> i += 1 > 0
>>> i
-4
和'> 0'似乎没有任何作用。为什么两个循环不同?
答案 0 :(得分:1)
这是因为某些num&bit
大于0,所以(即我的跑步中有一个8
):
>>> a=8
>>> a>0
True
>>> int(a>0)
1
不是8
!!!
这就是为什么。
答案 1 :(得分:1)
num & bit
与num & bit > 0
不同;
num & bit
是一个数字(int
),而num & bit > 0
是一个布尔值(bool
);
在python中,True
布尔值用作数字时是1
;
>>> i = -5
>>> i += 2
>>> i
-3
>>> i = -5
>>> i += 2 > 0
>>> i
-4
根据经验,请勿使用1
或0
进行测试;用随机数进行测试(2
也很糟糕,但此处易于阅读);
答案 2 :(得分:0)
在线
function reviveFromJSON(key, value) {
let result = value;
if (
(typeof value === 'object' && value !== null)
&& (value.hasOwnProperty('_type'))) {
switch (value._type) {
case 'BigNumber':
result = Object.assign(new BigNumber(0), value._data);
}
}
return result;
}
state = JSON.parse(serialisedState, reviveFromJSON);
console.debug("state:", state);
// → { … dolor: BigNumber { s: 1, e: 2, c: [ 1, 0, 7, 5, 8 ] }, … }
您正在将cnt的值增加1,2,4,8的值。 在排队时
cnt += num & bit
首先,您要验证语句,该语句返回0或1,然后使值无效0或1。 您可以通过在两个代码中打印cnt值来进行交叉检查。