点击上方“五分钟学算法”,选择“星标”公众号

重磅干货,第一时间送达

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

题目

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

给定一个单链表的头节点 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。

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

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

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

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

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

代码如下:

    //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)

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

步骤如下:

1、先进行逆序

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

2、处理后的结果如下

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

代码如下:

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

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

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

总结

关于链表的算法题,在面试的时候听说是挺常考的,大家可以多注意注意。


推荐阅读

•   吴师兄实名吐槽 LeetCode 上的一道题目。。。•   面试字节跳动时,我竟然遇到了原题……•   计算机专业的学生怎样练习编程才能把编程学精通?•   为什么 MySQL 使用 B+ 树•   一道简简单单的字节跳动算法面试题


欢迎关注我的公众号“五分钟学算法”,如果喜欢,麻烦点一下“在看”~

卧槽!字节跳动的面试算法题,实在太变态了相关推荐

  1. 字节跳动的面试算法,实在太变态了

    点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言,  真爱 来源公众号:苦逼的码农 前几天我去面试字节跳动,面试官问了一道链表相关的算法题, ...

  2. 最短时间搞定算法:字节跳动Android岗算法题考前突击宝典

    前言 一个人,一支笔,一个晚上,一个奇迹.这是学生党的常规操作. 大学里也同样有很多奇迹的创造者:每次一到期末考试的前几个晚上,各个变身"最强大脑",上知天文,下晓地理,还精通人文 ...

  3. 2021年最新字节跳动Android面试真题解析

    这里概括一下给同伴们的几个小建议: 1.把自身的技能练扎实, 2.找跟你过往经历匹配度非常高的岗位, 3.面试的时候充分展现你个人的软实力硬实力. 关于内推的(同公司应该是hr伙伴的良心建议): 1. ...

  4. Android刘海屏、水滴屏全面屏适配详解,997页字节跳动Android面试真题解析火爆全网

    适配方式 适配方式有两种: 将targetSdkVersion版本设置到API 24及以上: 这个操作将会为<application> 标签隐式添加一个属性,android:resizea ...

  5. 997页字节跳动Java面试真题解析火爆全网,系列教学

    前言 最近刷到了一句耐人寻味的话,"解决雪崩问题的最好办法是不发生雪崩". 不论是在硅谷互联网公司里还是在国内的互联网平台上,曾多次遇到过海量规模的交易瞬间吞噬平台的悲惨故事. 核 ...

  6. Android冷启动优化解析,997页字节跳动Android面试真题解析火爆全网

    ThisTime:是指调用过程中最后一个Activity启动时间到这个Activity的 startActivityAndWait调用结束; TotalTime:是指调用过程中第一个Activity的 ...

  7. Android 高质量开发之崩溃优化,2020-2021字节跳动Android面试真题解析

    除了常见的崩溃,还有一些会导致应用异常退出的情况,例如: 主动自杀.Process.killProcess().exit() 等 崩溃.出现了 Java 或 Native 崩溃 系统重启.系统出现异常 ...

  8. 面试:算法LRU(Least Recently Used),字节跳动Java研发算法题

    LRU是什么? 首先考虑这样的一个业务场景,小王在A公司上班,有一天产品提出了一个需求:"咱们系统的用户啊,每天活跃的就那么多,有太多的僵尸用户,根本不登录,你能不能考虑做一个筛选机制把这些 ...

  9. 997页字节跳动Android面试真题解析火爆全网,分享两道阿里P7究极难度算法题

    开头 经常有网友在知乎问答提两个问题:"现在学习移动开发还有前景吗?""开发还有什么可以研究的?".网友回复:"现在还学移动开发,如同49年加入国军. ...

  10. 字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

    字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么 前言: 金九银十过了金三银四还会远嘛,本文后面分享面试题给正准备跳槽,准备找工作的你,这次面试字节跳动也是做了很多的准备,还好顺利拿到了o ...

最新文章

  1. AS更改初始布局遇到的问题
  2. 通过阿里云容器镜像服务海外服务器构建spark-operator镜像
  3. 最受 IT 公司欢迎的 30 款开源软件
  4. Centos服务器查看当前的并发数
  5. Sharepoint中的Feature Stapling功能
  6. C语言提前结束for循环,[新人求指教]51C语言编程可否用中断令循环结束提早结束...
  7. 吴恩达深度学习5.2练习_Sequence Models_Emojify
  8. 思达报表工具Style Report基础教程—用选择列表,选择树进行数据过滤
  9. θ Some 与 θ All 子查询
  10. 55个高质量的Magento主题,助你构建电子商务站点
  11. 查看设备UUID的方法
  12. 工业相机镜头选型教程
  13. wdr7660虚拟服务器设置,TP-Link TL-WDR7660无线桥接怎么设置?
  14. excel单元格内换行的方法
  15. 881. 救生艇-快速排序加贪心算法
  16. 图片懒加载(仿SDWebImage)
  17. 例7.6有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。
  18. Linux中chkconfig工具详解(世间有许多美好的东西,但真正属于自己的却并不多)
  19. java中日期加上特定的天数或者时间
  20. linux安装酷狗软件下载,Ubuntu 9.04安装kugou(酷狗)音乐

热门文章

  1. ImageMagick图片转PDF
  2. strcmp()函数用法及其详解
  3. Ubuntu 局域网下查看ip及计算机名
  4. 计算机原理实验交通灯自动控制系统设计,微机原理交通灯控制系统设计实验..doc...
  5. 中国的量子软件无法再次失去三十年
  6. wifi分析仪怎么看哪个信道好_一定得学的切换WiFi信道技巧,让你的网速如飞!...
  7. 【Android工具】更新wifi分析仪,wifi信道信息查看工具,wifi分析仪3.10.6L
  8. 哲学与科学的批判性思维工具
  9. 【MATLAB imagesc 背景色】
  10. linux下sybase创建数据库,教小白搭建sybase数据库环境