【DW组队学习—LeetCode】day01

18 篇文章 0 订阅
12 篇文章 0 订阅
本文是关于LeetCode的解题记录,包括逆序存储的链表两数相加、寻找两个正序数组的中位数以及最长回文子串的问题。对于两数相加,通过遍历链表相加并处理进位。寻找中位数,采用合并数组并排序的方法。最长回文子串问题暂无思路。
摘要由CSDN通过智能技术生成

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
【示例 1】输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8]
解释:342 + 465 = 807.
【示例 2】输入:l1 = [0], l2 = [0] 输出:[0]
【示例 3】输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

首次作答

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        carry = 0

        val = l1.val + l2.val + carry
        self.val = val % 10
        if val >= 10:#如果两数加和大于等于10则进1
            carry = 1
        else:
            carry = 0

        if l1.next and l2.next:#当前两个链表均不是最后一个节点,则正常计算
            if carry == 1:
                l1.next.val += 1

        elif (l1.next != None and l2.next != None):#当前两个链表均为最后一个节点,则分情况结束
            if val >= 10:
                self.next = ListNode(1,None)
            return self

        elif (l1.next and l2.next != None) or (l1.next != None and l2.next):#只有l2是最后一个节点,则l2增加新节点辅助判断
            if l1.next:#l1未结束,则给l2增加节点
                l2.next = ListNode(0,None)#创建节点
            else:#l2未结束,则给l1增加节点(需要判断有没有进位
                l1.next = ListNode(carry,None)

输出结果:
在这里插入图片描述
【错误1】发现没有实际输出
【原因】可能没太弄清楚机制
【错误2】发现进位机制有错

【疑问1】没有理解self的实际含义
【解释】可以理解为self是指当下自身的一个状态或者环境
【疑问2】尝试了print结果之后,发现只有第一个输出,说明只进行了第一组的加和,没有自动往下进行,所以还是需要自己写,但是不能嵌套当前函数,需要自己想办法?
【解释】发现了调试后台,看了下其他代码,应该是完成一步就可以了,但是还需要看下前后代码确定具体需要什么功能

尝试思路:
1、设置初始总链表,以及指针节点和进位符
2、如果当前节点均为非空,则相加并判断是否需要进位
3、如果下一节点有其中一个链表为空节点,则增加0值节点补齐链表
4、如果链表均结束,但进位符仍为1,则在末尾增加一个节点
5、输出

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        node = ListNode(0,None)
        newl = node
        carry = 0
        while l1 != None and l2 != None:
            sumn = l1.val + l2.val + carry
            node.next = ListNode(sumn % 10, None)
            l1 = l1.next
            l2 = l2.next
            node = node.next
            carry = 0 if sumn // 10 == 0 else 1
            if l1 == None and l2 != None:
                l1 = ListNode(0, None)
            elif l1 != None and l2 == None:
                l2 = ListNode(0, None)
        node.next = ListNode(carry, None) if carry == 1 else None
        return newl.next

在这里插入图片描述

4. 寻找两个正序数组的中位数

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
**进阶:**你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
【示例 1】输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
【示例 2】输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
【示例 3】输入:nums1 = [0,0], nums2 = [0,0] 输出:0.00000
【示例 4】输入:nums1 = [], nums2 = [1] 输出:1.00000
【示例 5】 输入:nums1 = [2], nums2 = [] 输出:2.00000
提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
    -10^6 <= nums1[i], nums2[i] <= 10^6

尝试思路:
1、将原数组合并成一个数组并排序
2、通过合并数组的长度找到中间或者中间两个数,确定中位数

代码:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        for i in range(len(nums2)):
            nums1.append(nums2[i])
        nums1.sort()
        l = len(nums1)
        if l % 2 == 0:
            median = (nums1[l // 2 - 1] + nums1[l // 2 ]) / 2
        else:
            median = nums1[l // 2]
        return median

在这里插入图片描述
对时间复杂度计算不是很行,所以进阶没有做

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。
【示例 1】输入:s = “babad” 输出:“bab”
解释:“aba” 同样是符合题意的答案。
【示例 2】输入:s = “cbbd” 输出:“bb”
【示例 3】输入:s = “a” 输出:“a”
【示例 4】输入:s = “ac” 输出:“a”
提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母(大写和/或小写)组成

暂时没有思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值