leetcode-5.16[1022. 從根到葉的二進制數之和、633. 平方數之和、371. 兩整數之和](python實現)

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

附上題目鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章