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)

附上题目链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值