记一道字节跳动的算法面试题

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg
来源公众号:苦逼的码农
作者:帅地

前几天有个朋友去面试字节跳动,面试官问了他一道链表相关的算法题,不过他一时之间没做出来,就来问了我一下,感觉这道题还不错,拿来讲一讲。

题目

这其实是一道变形的链表反转题,大致描述如下

给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)

例如:链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。

解答

这道题的难点在于,是从链表的尾部开始组起的,而不是从链表的头部,如果是头部的话,那我们还是比较容易做的,因为你可以遍历链表,每遍历 k 个就拆分为一组来逆序。但是从尾部的话就不一样了,因为是单链表,不能往后遍历组起。不过这道题肯定是用递归比较好做,对递归不大懂的建议看我之前写的一篇文章为什么你学不会递归?告别递归,谈谈我的一些经验,这篇文章写了关于递归的一些套路。

先做一道类似的反转题

在做这道题之前,我们不仿先来看看如果从头部开始组起的话,应该怎么做呢?例如:链表:1->2->3->4->5->6->7->8->null, K = 3。调整后:3->2->1->6->5->4->7->8->null。其中 7,8不调整,因为不够一组。

对于这道题,如果你不知道怎么逆序一个单链表,那么可以看一下我之前写的如何优雅着反转单链表

这道题我们可以用递归来实现,假设方法reverseKNode()的功能是将单链表的每K个节点之间逆序(从头部开始组起的哦);reverse()方法的功能是将一个单链表逆序。

那么对于下面的这个单链表,其中 K = 3。

640?wx_fmt=png

我们把前K个节点与后面的节点分割出来:

640?wx_fmt=png

temp指向的剩余的链表,可以说是原问题的一个子问题。

我们可以调用reverseKNode()方法将temp指向的链表每K个节点之间进行逆序。

再调用reverse()方法把head指向的那3个节点进行逆序,结果如下:

640?wx_fmt=png

再次声明,如果对这个递归看不大懂的,建议看下我那篇递归的文章

接着,我们只需要把这两部分给连接起来就可以了。最后的结果如下:

640?wx_fmt=png

代码如下:

    //k个为一组逆序public ListNode reverseKGroup(ListNode head, int k) {ListNode temp = head;for (int i = 1; i < k && temp != null; i++) {temp = temp.next;}//判断节点的数量是否能够凑成一组if(temp == null)return head;ListNode t2 = temp.next;temp.next = null;//把当前的组进行逆序ListNode newHead = reverseList(head);//把之后的节点进行分组逆序ListNode newTemp = reverseKGroup(t2, k);// 把两部分连接起来head.next = newTemp;return newHead;}//逆序单链表private static ListNode reverseList(ListNode head) {if(head == null || head.next == null)return head;ListNode result = reverseList(head.next);head.next.next = head;head.next = null;return result;}

回到本题

这两道题可以说是及其相似的了,只是一道从头部开始组起,这道从头部开始组起的,也是 leetcode 的第 25 题。而面试的时候,经常会进行变形,例如这道字节跳动的题,它变成从尾部开始组起,可能你一时之间就不知道该怎么弄了。当然,可能有人一下子就反应出来,把他秒杀了。

其实这道题很好做滴,你只需要先把单链表进行一次逆序,逆序之后就能转化为从头部开始组起了,然后按照我上面的解法,处理完之后,把结果再次逆序即搞定。两次逆序相当于没逆序。

例如对于链表(其中 K = 3)

640?wx_fmt=png

我们把它从尾部开始组起,每 K 个节点为一组进行逆序。

步骤如下

1、先进行逆序

640?wx_fmt=png

逆序之后就可以把问题转化为从头部开始组起,每 K 个节点为一组进行逆序。

2、处理后的结果如下

640?wx_fmt=png

3、接着在把结果逆序一次,结果如下

640?wx_fmt=png

代码如下

public ListNode solve(ListNode head, int k) {// 调用逆序函数head = reverse(head);// 调用每 k 个为一组的逆序函数(从头部开始组起)head = reverseKGroup(head, k);// 在逆序一次head = reverse(head);return head;}

类似于这种需要先进行逆序的还要两个链表相加,这道题字节跳动的笔试题也有出过,如下图的第二题

640?wx_fmt=jpeg

这道题就需要先把两个链表逆序,再节点间相加,最后在合并了。

总结

关于链表的算法题,在面试的时候听说是挺常考的,大家可以多注意注意,遇到不错的链表算法题,也欢迎扔给我勒。

640?wx_fmt=png

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg

推荐阅读:

  • mysql表设计要注意什么?

  • 漫话:如何给女朋友解释鸿蒙OS是怎样实现跨平台的?

  • 换脸软件 ZAO 刷屏:你在玩换脸,别人想要你的脸!

  • 只给测试集不给训练集,要怎么做自己的物体检测器?

  • 华为鸿蒙为什么非要碰物联网?

  • Dropout、梯度消失/爆炸、Adam优化算法,神经网络优化算法看这一篇就够了

真香,朕在看了!

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

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

相关文章

带您探究云存储的奥秘,三分钟帮您快速了解OSS

摘要&#xff1a; 快来&#xff0c;带您探究云存储的奥秘&#xff0c;三分钟帮您快速了解OSS。 阿里云对象存储服务&#xff0c;简称 OSS&#xff0c;是一种面向海量数据规模的分布式存储服务&#xff0c;具有稳定、可靠、安全、低成本的特点&#xff0c;能够提供十一个九的数据…

六大主题报告,四大技术专题,AI开发者大会首日精华内容全回顾

戳蓝字“CSDN云计算”关注我们哦&#xff01;9月6-7日&#xff0c;2019中国AI开发者大会&#xff08;AI ProCon 2019&#xff09; 在北京拉开帷幕。本次大会由新一代人工智能产业技术创新战略联盟&#xff08;AITISA&#xff09;指导&#xff0c;鹏城实验室、北京智源人工智能研…

SQL老司机,居然是这样智能挖掘异常日志

摘要&#xff1a; 提取异常日志是个大难题 面对海量的日志(TB乃至PB级别&#xff09;&#xff0c;如何从日志中挖掘出异常信息对于大部分的开发者而言是一个大难题。例如&#xff0c;判断机器的延时是否正常&#xff0c;部分request是否正常。通常&#xff0c;我们对于异常的数…

华为杯数学建模优秀论文_【优秀论文】2019数维杯国际大学生数学建模竞赛B题优秀论文...

推荐入群2020数维杯国际赛参赛群132020数维杯国际大学生数学建模竞赛于2020年11月26日08:00(周四)—11月30日08:00(周一)进行&#xff0c;报名正在火热进行中&#xff0c;扫码了解详情或可直接报名&#xff01;扫码了解详情或可直接报名赛题B回顾2019数维杯国际赛赛题B回顾点击…

Lucene解析 - 基本概念

摘要&#xff1a; 前言 Apache Lucene是一个开源的高性能、可扩展的信息检索引擎&#xff0c;提供了强大的数据检索能力。Lucene已经发展了很多年&#xff0c;其功能越来越强大&#xff0c;架构也越来越精细。它目前不仅仅能支持全文索引&#xff0c;也能够提供多种其他类型的索…

FileZilla 下载安装使用

我电脑是win10 64位的&#xff0c;不知软件为何这样命名&#xff0c;已经用了2年多了。 FileZilla 版本&#xff1a;3.27.1下载链接 http://gainetsoftwares.kuaiyunds.com/gainetsoftwares/FileZilla3d0899f3-d291-4714-bd45-027ffaa49962.zip 1、 双击FileZilla_3.27.1_win3…

Vicor再携创新产品“登陆”ODCC大会,有详情!

戳蓝字“CSDN云计算”关注我们哦&#xff01;目前&#xff0c;越来越多的应用系统对电源系统的功率密度及转换效率提出了更高要求&#xff0c;在电源系统设计中不仅功率密度是众多要素之一&#xff0c;其他例如电源系统架构、多种开关拓扑、电源模块和基于分立器件设计的封装技…

Lucene 查询原理

摘要&#xff1a; # 前言 Lucene 是一个基于 Java 的全文信息检索工具包&#xff0c;目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理&#xff0c;就需要深入lucene这一层&#xff0c;看看lucene是如何存储需要检索的数…

mac解压rar命令_苹果mac电脑上很好用的免费压缩软件?ezip压缩软件分享

在开始之前&#xff0c;先问问用苹果电脑的大家一个问题&#xff0c;有没有遇到过这种情况呢&#xff1f;就是好不容易在网上找到了需要的素材&#xff0c;然后下载回来后发现&#xff0c;想解压却解压不了。因为mac系统自带的压缩工具是不支持rar格式的&#xff0c;而在网上很…

如何从机器学习数据中获取更多收益

摘要&#xff1a; 本文讲解一些关于机器学习数据集的小技巧&#xff0c;分享个人经验&#xff0c;可供读者参考。对于深度学习而言&#xff0c;合适的数据集以及合适的模型结构显得至关重要。选择错误的数据集或者错误的模型结构可能导致得到一个性能不佳的网络模型&#xff0c…

CSDN×易观算法大赛火热进行中~

伴随着5G、物联网与大数据形成的后互联网格局的逐步形成&#xff0c;日益多样化的用户触点、庞杂的行为数据和沉重的业务体量也给我们的数据资产管理带来了不容忽视的挑战。为了建立更加精准的数据挖掘形式和更加智能的机器学习算法&#xff0c;对不断生成的用户行为事件和各类…

该放弃正在堕落的“RNN和LSTM”了

摘要&#xff1a; 随着技术的发展&#xff0c;作者觉得是时候放弃LSTM和RNN了&#xff01;到底为什么呢&#xff1f;来看看吧&#xff5e;递归神经网络&#xff08;RNN&#xff09;&#xff0c;长期短期记忆&#xff08;LSTM&#xff09;及其所有变体&#xff1a;现在是放弃它们…

textarea支持a标签_微慕小程序开源版A标签优化说明

微慕WordPress小程序所有版本里&#xff0c;对于文章详情里文字内容的解析&#xff0c;都是通过开源组件&#xff1a;wxParse&#xff1b;不过这个组件已经停止维护&#xff0c;微慕小程序在这个组件上做了一些优化&#xff0c;让文章里文字在小程序显示更加完美。但&#xff0…

七本书籍带你打下机器学习和数据科学的数学基础

摘要&#xff1a; 本文主要介绍七本关于机器学习和数据科学数学基础的经典教材&#xff0c;是一份不可多得的书单整理。大多数人学习数据科学的重心放在编程上面&#xff0c;然而&#xff0c;要真正精通数据科学的话是不能够忽视数据科学背后的数据基础。本篇文章&#xff0c;将…

奇葩面试官让我回去等通知!看我怎么虐他!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 农翻身刘鑫来源 | 码农翻身后记&#xff1a;已经发了两篇漫画了&#xff0c;一个是《我才是世界上最好的语言》&#xff0c;还有一个是《HTTP之大明邮差》&#xff0c;前两篇主要讲技术&#xff0c;这一篇是娱乐性质&#xf…

阿里:千亿交易背后的0故障发布

摘要&#xff1a; 阿里巴巴千亿交易背后&#xff0c;如何尽量避免发布故障&#xff1f;在面对实际运维过程中遇到的问题该如何解决&#xff1f;近日&#xff0c;在刚刚结束的 GOPS深圳站大会上&#xff0c;阿里巴巴运维技术专家少荃&#xff0c;给我们带来了解决方案和思路。前…

华为麒麟990芯片发布;谷歌宣布开源创新隐私保护技术;阿里20亿美元全资收购网易考拉;中国联通将设立100亿5G创新基金……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 东风新款电动车菱智M5 EV上市…

C++继承和组合——带你读懂接口和mixin,实现多功能自由组合

摘要&#xff1a; 本文详细介绍了C继承的三种方式和相关重要概念&#xff0c;整理了众多继承与组合中的注意问题。在C继承存在不安全的默认实现&#xff0c;非虚函数的覆盖&#xff0c;多重继承的函数名冲突、菱形继承等众多问题下&#xff0c;如何实现多个功能的自由组合&…

如何在阿里云•对象存储OSS托管用户域名的https证书

摘要&#xff1a; OSS服务支持将用户域名绑定到OSS域名&#xff0c;并为此用户域名提供HTTPS证书托管服务。以满足用户使用自己的域名也能支持HTTPS安全加密的访问方式传输数据。面向人群您已经拥有了自己的域名。您已将或准备将自己的域名绑定到OSS域名上&#xff0c;并且使用…

win10系统VMware Workstation与Device/Credential Guard不兼容怎么办

解决方法&#xff1a; 打开本电脑-》管理-》服务和应用程序-》服务下找到如下图的HV 主机服务&#xff0c;双击选择禁用。 或者 转到“ 控制面板” >“ 卸载程序” >“ 打开或关闭Windows功能”以关闭Hyper-V。 步骤二&#xff1a;通过命令关闭Hyper-V&#xff08;控制…