題目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)