题目1
题解1
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# def sumRootToLeaf(self, root: TreeNode) -> int:
# """
# 递归
# """
# return self.helper(root, 0)
# def helper(self, root, base):
# # 如果为空节点,则返回0
# if root == None:
# return 0
# # 如果为叶子节点,则返回最终值
# if root.left == None and root.right == None:
# return 2 * base + root.val
# # 如若是普通节点,base等于2 * base + root.val,然后求其左右节点值
# base = 2 * base + root.val
# return self.helper(root.left, base) + self.helper(root.right, base)
def sumRootToLeaf(self, root: TreeNode) -> int:
"""
迭代-深度优先
"""
if not root:
return 0
result = 0
# 创建一个栈,实现深度优先搜索
stack = [(root, 0)]
while stack:
root, num = stack.pop()
# 如果为叶子节点,则result加上这个值
if not root.left and not root.right:
result += num * 2 + root.val
# 若果它的左节点存在,则把这个节点和到和这个值的累加值添加到栈
if root.left:
stack.append((root.left, num * 2 + root.val))
if root.right:
stack.append((root.right, num * 2 + root.val))
return result
题目2
题解2
class Solution:
def judgeSquareSum(se1lf, c: int) -> bool:
"""
双指针法,它的平方数之和必定在sqrt(c)两边或重合
"""
import math
r = int(math.sqrt(c))
l = 0
while l <= r:
if l ** 2 + r ** 2 == c:
return True
if l ** 2 + r ** 2 > c:
r -= 1
else:
l += 1
return False
题目3
题解3
class Solution:
def getSum(self, a: int, b: int) -> int:
"""
python 由于不知道符号位具体是第几位,因此需要进行的操作是
1. 将输入数字转化成无符号整数
2.计算无符号整数相加并的到结果
3. 结果根据范围判定,映射为有符号整型
"""
# 1. 转补码,如果为正数,则补码等于本身,负数的补码等于取反+1。位运算都是在补码的基础上进行的
# 2. 因为python没有位的概念,它的负数通过负号加数值表示,并不是最高位(符号位为1)表示
# 3. python中,1表示无符号位(补码)是1,-1表示无符号位(补码)是4294967295, 正负的分水岭是2147483648(0x80000000十六进制数)
# 4. python位运算都是先将其转换为补码,运算完再原码
# 5. -1的十六进制为0xFFFFFFFF,如果把它看成无符号整数,就是十进制的4294967295。
a &= 0xFFFFFFFF
b &= 0xFFFFFFFF
while b:
# 记录进位情况
carry = a & b
# 不考虑进位的相加
a ^= b
b = ((carry) << 1) & 0xFFFFFFFF
# ~(a^0xFFFFFFFF) 这里相当于-1取反,负数从补码到原码
return a if a < 0x80000000 else ~(a^0xFFFFFFFF)