是否有经验决定是否使用逻辑运算符?

时间:2015-09-01 03:03:23

标签: python logical-operators

我遇到了一个采访问题:

我们有任何顺序从1到n的数字。我们开始将这些数字以任何顺序放入数组大小为n-1。这意味着将有一个数字不会输入到数组中。我们必须找到它。

简单的解决方案:

a = [4, 2, 3, 1, 5, 7]
n = 7
print sum(range(1, n+1)) - sum(a) ## prints 6

我在互联网上找到的一个解决方案:

  • 对1个n中的所有元素进行XOR并存储到X1

  • XOR的所有元素并存储到X2

  • 缺少元素= X1 XOR X2

我制作的代码是:

print reduce(lambda a, b: a ^ b, range(1, n+1)) ^ reduce(lambda a, b: a ^ b, a) ## prints 6

第二种方法对我来说绝对不直观。是否存在以这种方式应用逻辑运算符的特定用例?

2 个答案:

答案 0 :(得分:1)

只是为了好玩:有另一种方法可以解决这个问题,使用着名的formula

n*(n+1)/2 - sum(a)
=> 6

并回答你的问题:不,这是在整数之间滥用bitwise operators的好用例(不是逻辑运算符,因为值不是布尔值!),以这种方式它完全掩盖了代码的意图。坚持使用算术,直观的解决方案。当需要将整数作为二进制值进行操作时,请使用按位运算符。

答案 1 :(得分:0)

按位操作尤其是XOR很重要,可以避免在这个采访问题中出现溢出。 XOR也是许多加密/校验和算法的基础。 here是一个很好的介绍视频,讨论位操作(从InterviewBit复制的视频链接)。