【发布时间】:2019-11-22 18:21:45
【问题描述】:
我在 this leetcode 工作,我想知道如何使用按位操作。原因是,当我使用 lru_cache 时,我得到 isUsed is not hashable 的错误。代替 isUsed 的 bool 数组,使用 int 和按位运算而不是 bool 的最佳做法是什么
def canIWin(self, n: int, target: int) -> bool:
@lru_cache(None)
def isWin(isUsed, target):
# print(isUsed,target)
if target<=0:
return False
for i in reversed(range(1,n+1)):
if not isUsed[i-1]:
if i>=target:
return True
isUsed[i-1] = True
if not isWin(isUsed[::], target-i):
return True
isUsed[i-1] = False
return False
if target <2:
return True
if n*(n+1)/2<target:
return False
return isWin([False]*n,target)
【问题讨论】:
-
如果您的代码使用列表工作,唯一的问题是列表不可散列,请尝试使用元组。如果结果证明效率不够高,那么只有这样才值得重写算法以使用整数作为位集。
-
我猜 tuple 的问题在于它是不可变的。我想我可以来回转换它
-
是的,来回转换将是最简单的解决方法。在
isWin函数的开头写isUsed = list(isUsed),把if not isWin(isUsed[::], ...):改成if not isWin(tuple(isUsed), ...):