链表题目之模拟类

还有一些题目是没有特别复杂的技巧,但是考察仔细程度以及基本的链表处理能力,从而考察在基本的逻辑处理上考虑的全面和细致层度。这类题目对于业务代码编码能力的鉴定的确是有一些帮助。

分隔链表(86)

题目:86. 分隔链表
把大于等于的放到一个新的链表上,当然第一个可能也被操作,直接用虚拟头节点,最后链表拼接,记得确保新链表的尾部是nil
新链表采用尾插法实现保障顺序
旧链表记得手摸模拟去掉一个节点的逻辑

func partition(head *ListNode, x int) *ListNode {dummyHead := &ListNode{Next:head}p := dummyHeadnewDummyHead := &ListNode{}pNew := newDummyHeadfor p.Next != nil {if p.Next.Val >= x {cur := p.Nextp.Next = p.Next.Next// 接到新的后面pNew.Next = curpNew = pNew.Next} else {p = p.Next}}pNew.Next = nilp.Next = newDummyHead.Nextreturn dummyHead.Next
}

奇偶链表(328)

题目:328. 奇偶链表
这个题目也是模拟其实和分割链表一样
使用尾插法,使用两个虚拟头,一个用来删除,一个用来尾插,最后记得封尾,然后再接上即可
本题和分割链表,都需要考虑一下移除一个节点之后,当前指针的位置

func oddEvenList(head *ListNode) *ListNode {dummyHead := &ListNode{Next:head}p1 := dummyHeaddummyHeadNew := &ListNode{}p2 := dummyHeadNewflag := false// 奇在前,第一个是奇for p1.Next != nil {if flag {// 从添加到p2 从p1删除cur := p1.Nextp1.Next = p1.Next.Nextp2.Next = curp2 = p2.Next} else {p1 = p1.Next}flag = !flag}p2.Next = nilp1.Next = dummyHeadNew.Nextreturn dummyHead.Next
}

复制带随机指针的链表(138)

题目:138. 随机链表的复制
这个也属于技巧,用map 新节点的Random存放复制时旧的Random,map 存放旧节点和新节点的映射关系
得用尾插法,所以要用虚拟头

func copyRandomList(head *Node) *Node {dummyHead := &Node{}p := dummyHeadm := make(map[*Node]*Node)for head != nil {cur := &Node{Val:head.Val,Random:head.Random,}m[head] = curhead = head.Nextp.Next = curp = p.Next}p = dummyHead.Nextfor p != nil {p.Random = m[p.Random]p = p.Next}return dummyHead.Next
}

两数相加(445)

题目:445. 两数相加 II
因为相加需要考虑进位问题,链表倒着走有很费劲,所以先将链表翻转,求和之后再翻转回来
求和就有很多细节要处理,进位问题、两个链表剩余的数量
最后的进位是1的情况

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {// 将两个加到l1上l1 = reverse(l1)l2 = reverse(l2)// 1 2 3// 4 9 // 5 1 4l1 = &ListNode{Next:l1}p1 := l1p2 := l2rest := 0for p1.Next != nil && p2 != nil {sum := p1.Next.Val + p2.Val + restif sum >= 10 {rest = 1sum -= 10} else {rest = 0}p1.Next.Val = sump1 = p1.Nextp2 = p2.Next}if p2 != nil {fmt.Println(p2.Val)p1.Next = p2 // 写到这里发现不好接了,所以需要保留p1 不为nil,所以上面处理要用p1.Next,所以l1要用虚拟头}// 剩余的继续for p1.Next != nil {sum := p1.Next.Val + restif sum >= 10 {rest = 1sum -= 10} else {rest = 0}p1.Next.Val = sump1 = p1.Next}if rest != 0 {p1.Next = &ListNode{Val:rest}}return reverse(l1.Next)
}
func reverse(head *ListNode) *ListNode {var newNode *ListNodefor head != nil {cur := headhead = head.Nextcur.Next = newNodenewNode = cur}return newNode
}

LRU

题目:146. LRU 缓存
LRU:最近最久未使用的会被淘汰–>最近使用的优先级要高–>使用链表记录优先级,前面的优先级高
–>使用双向链表,便于处理–>使用虚拟头、尾部,处理没有节点是的特殊情况,这样就没有特殊情况了。
使用Map实现O1查找
Get时如果存在,那就需要判断如果不在最前面,就需要移动到最前面
Put如果存在,则更新值,同时移动到最前面,如果不存在,则构建,之后放到最前面,同时需要先判断如果已经满了则需要链表中删除、清理map

移动到最前面:这里采用先从原位置删除,再放到最前面的方式

type  Node struct {Key intVal intPre *NodeNext *Node
}type LRUCache struct {Cap intm map[int]*NodedummyHead *NodedummyTail *Node
}func Constructor(capacity int) LRUCache {lru := LRUCache{Cap:capacity,m:make(map[int]*Node, capacity),dummyHead:&Node{},dummyTail:&Node{},}lru.dummyHead.Next = lru.dummyTaillru.dummyTail.Pre = lru.dummyHeadreturn lru
}func (this *LRUCache) Get(key int) int {node, ok := this.m[key]if !ok {return -1}this.MoveToHead(node)return node.Val
}func (this *LRUCache) Put(key int, value int)  {node, ok := this.m[key]if ok {node.Val = valuethis.MoveToHead(node)return}node = &Node{Val:value,Key:key,}if len(this.m) >= this.Cap {lastNode := this.dummyTail.Predelete(this.m, lastNode.Key)this.removeNodeFromList(lastNode)}this.m[node.Key] = nodethis.addNodeToHead(node)
}func (this *LRUCache) MoveToHead(node *Node)  {if node.Pre == this.dummyHead {return}this.removeNodeFromList(node)this.addNodeToHead(node)
}func (this *LRUCache) addNodeToHead(node *Node)  {// h,2 -- > h,1,2node.Next = this.dummyHead.Nextnode.Pre = this.dummyHeadthis.dummyHead.Next = nodenode.Next.Pre = node
}func (this *LRUCache) removeNodeFromList(node *Node)  {// 1 2 3 --> 1 3node.Pre.Next = node.Nextnode.Next.Pre = node.Pre
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏工厂:AI(AIGC/ChatGPT)与流程式游戏开发

游戏工厂:AI(AIGC/ChatGPT)与流程式游戏开发 码客 卢益贵 ygluu 关键词:AI(AIGC、ChatGPT、文心一言)、流程式管理、好莱坞电影流程、电影工厂、游戏工厂、游戏开发流程、游戏架构、模块化开发 一、前言…

Vue76-路由对浏览器历史记录的影响

一、push模式 默认是push 二、replace模式 替换当前记录! (当前指针指向的那一条记录) 三、小结

完全禁用 Windows Defender

你有没有这样的情况,安装软件时,关闭了Windows实时保护,过几天,打开软件时,发现里面的附件被吞噬,因为Defender又自动打开了,那么,有没有一款可以完全禁用Defender的工具&#xff0c…

年薪50w+的项目经理,手把手教你如何复盘

复盘是一种重要的学习和改进工具,对于项目经理来说,能帮助识别项目中的成功与失败,为未来的项目管理提供宝贵经验。 理论部分 定义目标。在开始复盘之前,明确复盘的目标是什么。是为了找出项目中的问题并提出解决方案&#xff0c…

Linux的设备模型

在设备模型出现以前,Linux的驱动存在以下问题: 1,设备和驱动没有分离。也就是说设备的信息是硬编码在驱动代码中的,这给驱动程序造成了极大的限制。如果硬件有所改动,那么必然要修改驱动代码。比如LED如果修改了管脚,那么就必然要修改驱动程序。这样就导致驱动的通用性很…

腾讯大牛,手把手教你建立自己的Android学习知识体系,附实例+面经+建议!

主要让我介绍了我的项目,又出了几个题让我做。 项目就是让我介绍我科研做的那个流式二维码数据传输系统,我介绍的时候面试官听的很仔细,让我详细介绍了拍到的二维码是如何定位、采样和识别转换成二进制流的。然后问我传输速率是多少&#xff…

Android开启wifi调试

1.首先需要电脑和手机设备在同一个局域网下 1.1 手机和电脑连接同一个wifi,这样就是在同一个局域网下 1.2 可以用手机开一个热点,然后电脑连接手机开启的热点,这样也算在同一个局域网下 2.开启手机设备的无线调试功能 这个功能好像是可以在…

yarn安装配置及使用教程

Yarn 是一款 JavaScript 的包管理工具,是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具,它提供了确定性、依赖关系树扁平化等特性,并且与 npm 完全兼容。以下是 Yarn 的安装及使用教程: Yarn 安装…

stm32学习笔记---新建工程步骤和点灯演示

目录 STM32的三种开发方式 基于寄存器的方式 基于库函数的方式 基于Hal库的方式 固件库介绍 新建基于标准库的工程步骤 配置寄存器来完成点灯操作 添加库函数来完成点灯操作 添加库函数 开始点灯操作 第一步:使能时钟 第二步:配置端口模式 …

JVM专题六:JVM的内存模型

前面我们通过Java是如何编译、JVM的类加载机制、JVM类加载器与双亲委派机制等内容了解到了如何从我们编写的一个.Java 文件最终加载到JVM里的,今天我们就来剖析一下这个Java的‘中介平台’JVM里面到底长成啥样。 JVM的内存区域划分 Java虚拟机(JVM&…

使用 Ubuntu x86_64 平台交叉编译适用于 Linux aarch64(arm64) 平台的 QT5(包含OpenGL支持) 库

使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库 目录 使用 Ubuntu AMD64 平台交叉编译适用于 Linux ARM64 平台的 QT5(包含 OpenGL/WebEngine 支持) 库写在前面前期准备编译全流程1. 环境搭建2. 复制源码包并解压,创…

【Python机器学习】NMF——将NMF应用于人脸图像

将NMF应用于之前用过的Wild数据集中的Labeled Faces。NMF的主要参数是我们想要提取的分量个数。通常来说,这个数字要小于输入特征的个数(否则的话,将每个像素作为单独的分量就可以对数据进行解释)。 首先,观察分类个数…

细胞核的分割与分类模型·HoVer-Net|动手实操

小罗碎碎念 上一期推文已经介绍了hover net的背景和代码仓库情况,这一期则是根据作者提供的示例代码进行分析,详细你看完这一期推文,应该就能大致掌握这些套路了。如果觉得意犹未尽,那就等待下一期吧,哈哈。 一、编程…

Vue3 + TS + Antd + Pinia 从零搭建后台系统(四) ant-design-vue Layout布局,导航栏,标签页

书接上回本篇主要介绍: Layout布局,导航栏,标签页继续填充目录 按需引入组件Layout布局,导航栏,标签页css样式 按需引入组件 使用unplugin-vue-components插件完成ant-design-vue组件的按需加载。 前文中已处理过&…

Java中的集合框架详解:List、Set、Map的使用场景

Java中的集合框架详解:List、Set、Map的使用场景 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,集合框架是一个非常重要…

数据结构(基础知识)

基础概念: 数据:数据是信息的载体,是描述客观事物属性的数,字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据元素:是数据的基本单位,在程序中常作为一个整体来考虑 数据对象&#…

运营管理和服务支撑阶段

我前面的所有设备都部署好了,现在就需要运营管理和服务支撑 遇到问题了迅速解决,避免风险扩大 我们也可以给客户提供上面的服务,提高客户的预警能力,安全风险处理能力 我们不仅提供设备,还提供服务 我们公司成立了安…

高考填报志愿选专业,要善于发掘自身优势

每年的高考季,如何填报志愿又再成为困扰家长以及学生的难题,可能在面对大量的专业时,无论是考生还是家长都不知道应该如何选择,好的专业孩子不一定有优势,感兴趣的冷门专业又担心日后找工作难。 实际上,专业…

React+TS前台项目实战(十六)-- 全局常用组件Pagination封装

文章目录 前言Pagination组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 [PC端&手机端] 总结 前言 在上篇文章中,我们封装了表格组件Table,本文则继续封装配套使用的分页器组件。想看Table表格组件的,可自行查看全局常用组件Tab…

对数据对象的理解

一、数据对象必须是由软件理解的复合信息来表示 二、数据对象可能是外部实体、地点或结构等,例如,一个人或一部车可以被认是数据对象,在某种意义上他们可以用一组属性来定义,数据对象描述包括了数据对象及其所有属性,…