力扣练习4.29-30

2024-04-30 15:52
文章标签 力扣 练习 30 4.29

本文主要是介绍力扣练习4.29-30,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

86. 分隔链表

解题思路:设置两个链表,分别装小于x和>=x的节点,最后将两个链表拼接。
步骤
1.初始化两个新链表的头结点和指针节点,初始化链表的指针节点
2.遍历变量,如果是小于x,就将第一个链表的指针节点指向该节点,并更新第一个链表的指针节点;大于等于同理;最后也要更新原始链表的指针节点
3.拼接两个链表,将第一个的尾节点指向第二个链表的头节点
4.为了防止第二个链表的尾节点指向不明确,导致可能的陷入环形结构,将其指向为空
5.返回第一个链表的头节点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:dummy_1 = ListNode(0) # 哑节点,用于存储所有小于x的节点dummy_2 = ListNode(0) # 哑节点,用于存储所有大于等于x的节点cur_1 = dummy_1 # 指针节点cur_2 = dummy_2cur = head# 遍历链表while cur:# 如果是小于x的节点if cur.val < x:cur_1.next = cur # 将链表1的指针指针节点指向该节点cur_1 = cur_1.next # 移动链表1的指针节点else:cur_2.next = curcur_2 = cur_2.next# 移动链表节点到下一个节点cur = cur.next# 链接两个链表,使用链表1的尾节点指向链表2的头结点cur_1.next = dummy_2.next# 确保大于或等于x的链表的尾部元素的next指针为None,避免循环cur_2.next = None# 返回链表1的头结点return dummy_1.next

237. 删除链表中的节点

解题思路

以往想到的删除方法就是把前驱节点的指针指向当前节点的后继节点。但是本题不提供头结点,只有要删除的节点。遍历不到前驱节点。

那就把自己当做前驱节点,删除后继节点(当做当前节点)。
具体做法是把后继节点复制到当前节点,删除后继节点即可。这样删除后的链表确实是删除了当前节点。

步骤

1.把后继节点的值复制到当前节点
2.把当前节点的指针指向后继节点的下一个节点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def deleteNode(self, node):""":type node: ListNode:rtype: void Do not return anything, modify node in-place instead."""# 修改node的值为后继节点的值node.val = node.next.val# 将node的指针指向后继节点的下一个节点node.next = node.next.next# 这样使得node整个节点更新为其后继节点

138. 复制带随机指针的链表

解题思路

要求是全新的链表,如果是普通链表,直接遍历,过程中创建新节点,前驱节点指向当前节点即可。
但是本题的节点加了个随机指针,既然随机,如果在遍历过程中新增节点,随机指针没地方指啊。

因此采用哈希表+二次遍历的方法。
建立键为原链表节点,值为新链表节点的哈希表。新链表节点的随机指针取默认值。
在二次遍历的时候,根据原链表节点的随机指针指向,更新新链表节点的随机指针。

步骤

1.初始化哈希表,指针节点
2.一次遍历链表,填充哈希表
3.重置指针节点到头节点,二次遍历,修改新节点的指针和随机指针。中间要考虑到随机指针指向空,会导致字典查不到该键对应的值。
4.返回新链表的头节点(哈希表对应的旧链表的头节点的值)

"""
# Definition for a Node.
class Node:def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):self.val = int(x)self.next = nextself.random = random
"""class Solution:def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':if not head: return # 哈希表存储旧新节点的映射_dict = {}cur = head# 第一次遍历链表,构建旧新节点的映射while cur:node = Node(x=cur.val) # 构建新节点(只能建立值)_dict[cur] = node # 将旧节点作为键,新节点作为值cur = cur.next# 重置指针节点,进行第二次遍历cur = head# 构建新链表节点的指针while cur:# 构建普通指向if cur.next: # 防止字典键为空_dict[cur].next = _dict[cur.next]# 随机指针if cur.random: # 考虑到cur.random为空时,出现字典里找不到的情况_dict[cur].random = _dict[cur.random]# 移动指针cur = cur.next# 返回头节点return _dict[head]

20. 有效的括号

解题思路

有效:次数和顺序都要满足要求。
使用栈,先进后出。
遍历字符串,将开放括号入栈,遇到闭合括号的时候弹出栈顶元素,如果是满足要求的,那栈顶元素一定和闭合括号是一对。如果不是,那就直接返回false。
最后也要检查有没有足够的闭合括号,如果栈里还剩的有开放括号,那肯定也是不行的。

步骤

1.初始化栈,哈希表(开放:闭合括号),手动加上特殊字符(防止第一词遍历就遇到闭合括号,空栈弹出报错)
2.遍历字符串,遇见开放括号就入栈;遇见闭合括号就弹出栈顶元素,并进行比较,能否消消乐。
3.遍历完成后检查是否栈中还有剩余的开放括号。

class Solution:def isValid(self, s: str) -> bool:# 初始化栈,哈希表:开放:闭合括号stack = ['#']_dict = {'(': ')', '[': ']', '{': '}', '#': '#'}# 遍历,开放括号入栈,闭合括号就出栈for i in s:if i in '([{': # 入栈stack.append(i)else: # 闭合括号,弹出栈顶元素temp = stack.pop()# 检查弹出元素的对应闭合括号是不是当前遍历到的if _dict[temp] != i:return False# 为防止第一次就遇到闭合括号,导致弹出元素失败(栈为空),先加了个特殊字符# 最后判断如果都消消乐完了,就还剩个手动添加的特殊字符了return len(stack) == 1

155. 最小栈

解题思路

使用两个栈完成,一个主栈,一个辅助栈(每个阶段的最小值放在栈顶)
入栈的时候,主栈直接入;辅助栈需要判断:如果辅助栈为空,或者小于等于栈顶元素,就能入栈。
出栈的时候,主栈直接出;辅助栈依然要判断:如果主栈出的元素等于栈顶元素,那么就要出栈。
取栈顶元素和最小元素就分别取主栈和辅助栈的栈顶元素(最后一个元素)即可

步骤

1.初始化主栈和辅助栈
2.入栈:主栈直接入;辅助栈进行判断:为空或者小于等于栈顶元素。注意不要使用pop,不然就把栈顶元素弹出了,使用索引
3.出栈:主栈直接出;辅助栈判断:主栈出的元素是不是等于其栈顶元素。
4.取值,直接按索引取。

class MinStack:def __init__(self):# 初始化self.stack = []self.min_stack = []def push(self, val: int) -> None:# 主栈入栈self.stack.append(val)# 如果辅助栈为空,或者元素小于等于辅助栈栈顶元素,就入栈if not self.min_stack or val <= self.min_stack[-1]:self.min_stack.append(val)def pop(self) -> None:value = self.stack.pop()# 根据值决定是否弹出辅助栈栈顶元素if value == self.min_stack[-1]:self.min_stack.pop()def top(self) -> int:# 返回栈顶元素return self.stack[-1]def getMin(self) -> int:# 返回最小元素return self.min_stack[-1]

这篇关于力扣练习4.29-30的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949289

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的