Leetcode刷题日志5.0

2023-11-20

目录

前言:

1.两数相加

2.无重复字符的最长子串

 3.整数反转

4.删除链表的倒数第 N 个结点 


前言:

        今天我又来继续分享最近做的题了,现在开始进入我们快乐的刷题时间吧!(编程语言Python3.0,难度:中等)

1.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例: 代码实现:

# 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, l2):
        li1=[]
        li2=[]
        p1=l1
        while p1:
            li1.append(str(p1.val))
            p1=p1.next
        p2=l2
        while p2:
            li2.append(str(p2.val))
            p2=p2.next
        li1=li1[::-1]
        li2=li2[::-1]
        a=str(int(''.join(li1))+int(''.join(li2)))[::-1]
        li3=[]
        for i in a:
            li3.append(int(i))
        l3 = ListNode(li3[0])
        cur=l3
        for i in range(1,len(li3)):
            p=ListNode(li3[i])
            cur.next=p
            cur=p
        return l3

 解题思路:这道题我们可以去创建两个列表作为题目所给的两个链表的数据储存容器,对此依次去循环两个链表,把里面的数据放入到li1和li2当中,然后按照题目的要求进行倒序,之后就把这两个列表里面的数据整合到一个整数相加,再把得到的结果放入到列表li3当中并且倒序,下面就是去创建一个链表,依次把li3里面的数据存入到链表当中就行了

2.无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        st = {}
        i, ans = 0, 0
        for j in range(len(s)):
            if s[j] in st:
                i = max(st[s[j]], i)
            ans = max(ans, j - i + 1)
            st[s[j]] = j + 1
        return ans

解题思路:先创建一个字典作为每个字符的位置数(从1开始)统计,然后对这个字符串进行循环,把每一个字符作为键,然后位置数作为值存入到字典当中,当遇到字典中已又的字符时就说明开始重新重复了,此时要去重新统计不连续最长字符串的个数,此时的i就应该是要和上一个出现的位置和此时的位置进行取最大,同时最长不连续字符串是对上一个的ans和此时(j+1)-i 统计的长度进行取最大。最后遍历完成了之后返回的ans就是最大的不连续字符串长度。

 3.整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

class Solution:
    def reverse(self, x):
        if x==0:
            return 0
        s=str(x)
        li=[]
        fu=[]
        for i in s:
            li.append(i)
        if li[0]=='-':
            fu.append(li[0])
            li=li[1:]
        if li[len(li)-1]=='0':
            li=li[:len(li)-1]
        xx=int(''.join(fu+li[::-1]))
        if xx>2**31-1 or xx<-(2**31):
            return 0
        return xx

 解题思路:这类题可以去用分类讨论去解决,如果输入0那么就返回0,把这个数字转换为字符串后放入列表当中然后对这个数字进行判断,如果有负号就把负号给提出来放入到列表fu中,然后对列表li做切片;如果列表li最后一个数字是0的话那么,就把0去掉(同样做切片处理),最后我们只需要把列表fu与li(倒序)拼接到一起就行了,然后判断数字xx是否在要求范围内,最后就输出结果。

4.删除链表的倒数第 N 个结点 

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 

 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head, n):
        count=0
        p=head
        while p:
            count+=1
            p=p.next
        if count==0 or count==1:
            head=None
            return head
        target=count+1-n
        if target==1:
            head=head.next
            return head
        c=1
        q=head
        while c+1<target:
            q=q.next
            c+=1
        q.next=q.next.next
        return head

 解题思路:首先我们要去统计这个链表有多少个节点记为count,按照题目要求删除掉倒数第n个节点,实际上就是删除掉第count+1-n个节点,下面就要进行分类讨论了,如果要删除掉第一个节点的话,那就让头结点之间往后面移动一位,然后返回就行了,如果要删除第二位节点及其以上的话,那么就要进行循环,找到要被删除的前一个节点,让这个节点指向被删除节点的下一个就行了。最后返回头结点。

 好了,以上就是今天的全部内容了,我们下一期再见!

分享一张壁纸:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode刷题日志5.0 的相关文章

随机推荐