力扣练习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]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2999033.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

当Kubeflow遇上GPU池化

随着人工智能技术的迅猛发展&#xff0c;AI开发已成为企业创新的重要驱动力。然而&#xff0c;在AI开发过程中&#xff0c;企业面临着诸多挑战&#xff0c;如开发工具的选择和开发资源如何高效利用等。本文将围绕这些挑战&#xff0c;探讨GPU池化如何赋能Kubeflow进行AI开发&am…

【git】.gitignore 个人总结

文章目录 1. 简介2. 格式3. 参考1. 文件名2. *.后缀3. ?.后缀4. []5. \6. **7. /8. ! 1. 简介 .gitignore是一个用于指定Git版本控制系统忽略特定文件或文件夹的配置文件。当我们在项目中添加文件并想要将它们纳入到版本控制中时&#xff0c;有时我们也会有一些不希望纳入版本…

VCSA6.7重置root密码

VCSA6.7重置root密码 1、登录VCSA所运行的ESXI主机 2、打开VCSA虚拟机Web控制台&#xff0c;先拍摄一个快照&#xff0c;然后重启虚拟机&#xff0c;在如下界面按"e" 3、找到linux开头的段落&#xff0c;在末尾追加rw init/bin/bash; 4、输入完成后&#xff0c;按&…

Windows编译OpenCV及扩展模块

OpenCV官网只提供了OpenCV Windows 64位动态库且不包括扩展模块&#xff0c;如果需要32位动态库&#xff0c;或者需要扩展模块的功能&#xff0c;则需要下载源码进行编译。 1. 版本说明与下载地址 OpenCV下载 https://github.com/opencv/opencv/releases/tag/4.9.0 OpenCV扩展模…

Python俄罗斯方块

文章目录 游戏实现思路1. 游戏元素的定义2. 游戏区域和状态的定义3. 游戏逻辑的实现4. 游戏界面的绘制5. 游戏事件的处理6. 游戏循环7. 完整实现代码 游戏实现思路 这个游戏的实现思路主要分为以下几个步骤&#xff1a; 1. 游戏元素的定义 Brick类&#xff1a;表示游戏中的砖…

《深入解析Windows操作系统》第7章读书笔记

1、远程过程调用RPC&#xff1a;传统上&#xff0c;网络软件是围绕着IO处理模型来组织结构的。例如在Windows中&#xff0c;当一个应用程序发出一个IO请求时&#xff0c;它就会发出一个网络操作。操作系统酌情处理&#xff0c;它将此请求转发给一个重定向器&#xff0c;此重定向…

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是&#xff1a;在 Go 语言中&#xff0c;数组长度也是数组类型的一部分&#xff01;所以尽管元素类型相同但是长度不同的两个数组&#xff0c;它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

ArcGIS+ChatGPT双剑合璧:从数据读取到空间分析,一站式掌握GIS与AI融合的前沿科技!

目录 专题一 AI大模型应用 专题二 ArcGIS工作流程及功能 专题三 prompt的使用技巧 专题四 AI助力工作流程 专题五 AI助力数据读取 专题六 AI助力数据编辑与处理 专题七 AI助力空间分析 专题八 AI助力遥感分析 专题九 AI助力二次开发 专题十 AI助力科研绘图 专题十一…

Slave SQL线程与PXB FTWRL死锁问题分析

1. 问题背景 2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSH TABLES WITH READ LOCK未释放导致备库复制延时拉大&#xff0c;慢日志内看持锁接近25分钟未释放。 版本&#xff1a; MySQL 5.7.21PXB 2.4.18 慢查询日志&#xff1a; 备份脚本中的备份命令&#xff1a;…

Linux内核之设定inode链接计数:set_nlink用法实例(六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

QT:小项目:登录界面 (下一个连接数据库)

一、效果图 登录后&#xff1a; 二、项目工程结构 三、登录界面UI设计 四主界面 四、源码设计 login.h #ifndef LOGIN_H #define LOGIN_H#include <QDialog>namespace Ui { class login; }class login : public QDialog {Q_OBJECTpublic:explicit login(QWidge…

金三银四面试题(二十三):装饰器模式知多少?

什么是装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地向对象添加新的行为&#xff0c;而无需修改原始对象的结构。通过将对象包装在一个或多个装饰器对象中&#xff0c;装饰器模式可以增强原始对象的功能。 装…

最详细的SSL证书说明及免费申请方法

JoySSL官网 注册码230918 SSL&#xff08;Secure Sockets Layer&#xff09;证书&#xff0c;现在通常指的是其继任者TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;是确保数据传输安全的核心技术之一。本文将深入探讨SSL证书的工作原理、重要性、类型以…

闪存存储和制造技术概述

闪存存储技术 引言 性能由高到低排序&#xff1a;SLC -> MLC -> TLC -> QLC 根据这个排序读写速度也越来越低&#xff0c;价格越来越便宜 1. SLC SLC&#xff08;Single-Level Cell&#xff0c;单层单元&#xff09;&#xff1a; SLC 闪存具有最高的性能、耐用性和可…

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

gateway全局token过滤器

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>创建一个tokenFilter 实现全局过滤器GlobalFilter,并且实现fitler方法 Value("${…

工信部CAPPVD公布24年一季度积分情况,海云安位居全国第二!

近日&#xff0c;工业和信息化部移动互联网APP产品安全漏洞专业库&#xff08;以下简称“CAPPVD漏洞库”&#xff09;根据《CAPPVD漏洞库支撑单位能力评定办法》和综合24年第一季度的漏洞报送、重要行业企事业单位漏洞加分、高危漏洞处置加分、标准支撑等&#xff0c;最终公布了…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…

值得推荐的文档透明加密软件TOP3

文档透明加密软件是一种可以对文档进行加密处理&#xff0c;同时保持文档的可读性和可编辑性的软件。通常&#xff0c;这种软件会在用户对文档进行保存或传输时自动对文档进行加密&#xff0c;而在用户需要访问文档时则会解密文档&#xff0c;以便用户正常地查看和编辑文档内容…