LeetCode腾讯精选50题---2,4,5

Day01

两数相加 (Medium)
# Definition for singly-linked list.
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution_baoli(object):
    # 暴力解法
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        """
        :type l1: ListNode[9, 9, 9]
        :type l2: ListNode[9, 9]
        :rtype: ListNode
        """
        # res为计算链表两两相加的结果,cur为可移动的result,digit初始化为0,是用于存放每一次链表相加后进位的数
        res = ListNode()
        cur = res
        digit = 0
        # 首先进来循环判断l1和l2
        while l1 != None or l2 != None:
            # 1.此时total为digit=0
            # 2.此时进入第二次循环,total = digit = 1
            # 3.此时进入第三次循环,total = digit = 1
            total = digit
            if l1 != None:
                total += l1.val
                l1 = l1.next
            # 3.此时第三次循环l2 = None
            if l2 != None:
                total += l2.val
                l2 = l2.next
            # 1.算出此时两链表第一节点相加以后的进位数,此时total应为9+9=18,而digit则为18 // 10 = 1
            # 2.算出此时两链表第二节点相加以后的进位数,此时total应为1+9+9=19,而digit则为19 // 10 = 1
            # 3.算出此时两链表第三节点相加以后的进位数,此时total应为1+9=10,而digit则为10 // 10 = 1
            digit = total // 10
            # 1.初始res = 0
            # 1.此时cur = res,所以cur往下走cur.next记录total与10的余数:18 % 10 = 8,所以res = 8,然后cur = cur.next,把cur继续往下走然后res不动
            # 2.此时cur.next = 19 % 10 = 9,所以res = 9 然后cur = cur.next,把cur继续往下走然后res不动
            # 3.此时cur.next = 10 % 10 = 0,所以res = 0 然后cur = cur.next,把cur继续往下走然后res不动,此时因为l1和l2都为None所以跳出while循环
            cur.next = ListNode(total % 10)
            cur = cur.next
        # 3.跳出循环后,但是digit还有值为1,此时cur.next为ListNode(digit)即为1,,所以res = 1,所以res = [0, 8, 9, 0, 1]
        if digit != 0:
            cur.next = ListNode(digit)
        # 4.此时res往下走,去除初始为0的位返回res.next = [8, 9, 0, 1]
        return res.next


class Solution_recursion(object):
    # 递归解法
    # Time complexity: O(M + N)
    # Space complexity: O(M + N)
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        """
        :type l1: ListNode[9, 9, 9]
        :type l2: ListNode[9, 9]
        :rtype: ListNode
        """
        # total为l1和l2链表节点之和,digit为和的进位数,remain为和的余数,res为保存当前余数结果
        # 1.首先进来,两链表第一节点相加total = 9 + 9 = 18,digit = 18 // 10 = 1,remain = 18 % 10 = 8,res = 8
        # 2.total = 10 + 9 = 19,digit = 19 // 10 = 1,remain = 19 % 10 = 9,res = 9
        # 3.total = 10 + 0 = 10,digit = 10 // 10 = 1,remain = 10% 10 = 0,res = 0
        # 4.total = 1 + 0 = 1,digit = 1 // 10 = 0,remain = 1% 10 = 1,res = 1
        total = l1.val + l2.val
        digit = total // 10
        remain = total % 10
        res = ListNode(remain)
        # 1.判断l1.next、l2.next和digit
        # 4.此时l1.next、l2.next和digit均为None,返回res[8, 9, 0, 1]
        if l1.next or l2.next or digit:
            # 若满足条件:
            # l1 = l1 = l1.next否则为ListNode(0) = 0
            # l2 = l2 = l2.next否则为ListNode(0) = 0
            l1 = l1.next if l1.next else ListNode(0)
            l2 = l2.next if l2.next else ListNode(0)
            # 1.令l1.val与进位数相加:9 + 1 = 10
            # 2.令l1.val与进位数相加:9 + 1 = 10,此时l2.next已经没有了所以此时l2 = ListNode(0) = 0
            # 3.令l1.val与进位数相加:0 + 1 = 1,此时l1.next、l2.next已经没有了所以此时l1 = l2 = ListNode(0) = 0
            l1.val += digit
            # 1.调用递归函数,total = 10 + 9 = 19
            # 2.调用递归函数,total = 10 + 0 = 10
            # 3.调用递归函数,total = 1 + 0 = 1
            res.next = self.addTwoNumbers(l1, l2)
        return res
寻找两个正序数组的中位数
from typing import List


class Solution_baoli(object):
	# 暴力法
    # 直接把两数组相加然后排序,判断此时数组长度的奇偶,并对应算出中位数
    # Time complexity: O(M + N)
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        # nums = sorted(nums1 + nums2)
        nums = nums1 + nums2
        nums.sort()
        l = len(nums)

        if l % 2 == 0:
            return (nums[l // 2] + nums[l // 2 - 1]) / 2
        else:
            return nums[l // 2]
最长回文子串
class Solution_baoli(object):
    # 暴力法
    def longestPalindrome(self, s: str) -> str:
        """
        :type s: str
        :rtype: str
        """
        if s == s[::-1]:
            return s

        max_len = 1
        res = s[0]

        for i in range(len(s)-1):
            for j in range(i + 1, len(s)):
                if j - i + 1 > max_len and s[i:j+1] == s[i:j+1][::-1]:
                    max_len = j - i + 1
                    res = s[i:j+1]
        return res
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值