1.第一题:
这是一道数学题。。。。
结论:作为先手,如果堆中石头的数量 n 不能被 4 整除,那么你总是可以赢得 Nim 游戏的胜利。
原因:
1.小于3块的话,你作为先手就可以全拿走,结束游戏。
2.如果刚好4块的话,作为先手一定会输,因为对手一定会拿走最后一块。所以在自己的回合中应避免自己剩下4个。
3.但是如果不是4倍数的话,就可以控制将4个留给对手,那么自己必定会赢。比如7,那就先把后四个排除,剩下3个,自己都拿走,就将四个僵局留给对手。比如13,将3*4剪掉,第一次自己拿走1个,后几轮对手不管哪几个,你都可以和他配对成4个,然后把最后4个留给他。
4.如果刚好是4的倍数,比如8,对方很容易将4的僵局留给你,将后面四个先排除,前四个你作为先手不管拿1-3几个,对面都可以和你加起来等于4,从而把后四个留给你。
所以把n除以4,如果整除,那就必定会输。相反,总会赢。
class Solution:
def canWinNim(self, n: int) -> bool:
if n%4==0:
return False
else:
return True
2.第二题
利用层次遍历,遍历时判断是否为左叶子节点:
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
if root==None:
return 0
res=0
demo=[root]
while demo:
node=demo.pop(0)
if node.left and node.left.left==None and node.left.right==None:
res+=node.left.val
demo.append(node.left)
elif node.left:
demo.append(node.left)
if node.right:
demo.append(node.right)
return res
3.第三题:
这道题真是,十分简单:
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
num=bin(x^y).count('1')
return num
4.第四题:
简单题,我用的列表来存储所有连续1的长度,最后返回最大值即可:
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
count=0
res=[]
for i in nums:
if i==1:
count+=1
else:
res.append(count)
count=0
res.append(count)
return max(res)