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

2023-10-30

来源公众号:苦逼的码农

作者:帅地

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

题目

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

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

例如:

解答

这道题的难点在于,是从链表的尾部开始组起的,而不是从链表的头部,如果是头部的话,那我们还是比较容易做的,因为你可以遍历链表,每遍历 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

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

总结

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一道字节跳动的算法面试题 的相关文章

  • css h5 端弹窗时禁止底部页面滚动

    h5 端页面在弹窗时禁止底部页面滚动 在实现时 我尝试过几种方法 方法一 touchmove stop prevent 在遮罩层中添加 touchmove stop prevent 可以实现禁止页面滚动 如下 div class dialo
  • C++中的几种构造函数

    以下内容主要摘抄博客 浅谈C 中的几种构造函数 林多 CSDN博客 c 构造函数 一 C 中的构造函数可以分为4类 1 默认构造函数 又名缺省构造函数 以Student类为例 默认构造函数的原型为 无参构造函数 Student 没有参数 2
  • 使用element-ui的el-scrollbar时滚动条没有显示出来但是页面可以滚动的解决办法

    如果使用 Element UI 的 el scrollbar 组件时 滚动条没有显示出来但页面可以滚动 可以尝试调用其 update 方法来更新滚动条 在适当的时机 例如在数据加载完成后或组件更新后 调用 el scrollbar 的 up
  • Selenium入门(一)Java 搭建 Selenium 环境

    前言 Selenium是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozilla Firefox Safari Google Chrom
  • SpringBoot全局异常处理

    需求 程序运行中可能出现各种错误 如果不对错误进行处理 那么客户端的体验会非常不好 但如果在业务代码中进行了太多的错误处理 造成代码臃肿 后期维护困难 因此 有必要进行全局的异常捕获 统一处理异常状况 工具类 HTTP状态码工具类 pack
  • react 井字棋 函数式写法

    用react写一个井字棋 看了官网的文档 自己写一个函数式的写法 比较简陋和粗糙 如有错误请在评论区指出 整体样式结构 样式代码就不放了 html return
  • pytorch实战(五)——时间序列多步预测的五种方法介绍

    当需要根据已有的时间序列数据 预测未来多个时刻的状态时 被称之为时间序列多步预测 时间序列多步预测有五种策略 分别为 1 直接多步预测 Direct Multi step Forecast 2 递归多步预测 Recursive Multi
  • Centos7部署kubernetes单机集群(K8S)

    Kubernetes 单机版部署还是比较简单的 下面开始操作吧 查看内核版本 cat etc redhat release 关闭selinux setenforce 0 sed i s SELINUX enforcing SELINUX d
  • [Java版]selenium关键字驱动框架设计实战

    引言 使用和学习selenium好长一段时间了 PO设计模式已经算是耳熟能详了 包含PageFactory 它是PO设计模式的延伸 也了解了BDD行为驱动框架 在关键字驱动框架设计方面 由于对java基础技术的理解难度 没有花时间去整理 故
  • Windows系统改装成Linux系统

    说下背景 上级领导要求的将一台windows系统的电脑改装成Linux系统的电脑 弄了一天半的时间终于弄好了 下面时操作过程以及自己遇到的一些坑 一 制作一个启动盘 使用一个大于8G的U盘制作启动盘 因为centos的镜像一般是4G左右 我
  • 交货单BAPI_OUTB_DELIVERY_CHANGE附加增强字段

    需求 通过BAPI OUTB DELIVERY CHANGE 更新交货单增强字段 我们发现bapi中含有参数EXTENSION2 通过在函数中寻找 找到对应位置SMOD V50B0001 se19创建实施 将对应参数传入标准程序内存中 对应
  • Unity:在Android平台发布

    1 文件 生成设置 平台 Android 单击切换平台 添加已打开场景 2 编辑 首选项 外部工具 直接全部勾选 3 文件 生成设置 玩家设置 公司名称 产品名称必填 默认图标为生成的app的图标 若使用EasyAR 需注意包名需要与Eas
  • 【SpringMVC】轻量级Web之MVC架构框架

    一 SpringMVC简介 一 SpringMVC学习目标 二 SpringMVC概述 三 SpringMVC快速入门 四 启动服务器初始化过程 五 Controller加载控制与业务bean加载控制 六 简化Servlet容器开发 二 设
  • 关于bash数组的几道面试笔试题—航班延误5h的郁闷都在此文

    数组作为最常使用和最基本的数据结构存在于各种编程语言中 但各语言里数组的定义 使用以及对应的属性方法各不相同 本文将从面试的角度出发 带领大家一同走近那个最熟悉又陌生的Bash Array re 1 如何定义一个包含多种数据类型元素的数组
  • URL地址的两种格式

    1 传统格式 格式 scheme host port path query fragment scheme 协议 例如http https ftp等 必写 host 域名或IP地址 必写 port 端口号 http 默认端口为 80 可以省
  • React中使用百度地图

    1 找到百度地图首页 进入百度地图开放平台 地址如下 百度地图开放平台 百度地图API SDK 地图开发 2 找到开发文档中react BMapGL 如上图所示 我们进入React BMapGL JSAPI 地址如下 React BMapG
  • 超详细 Ubuntu安装PyTorch步骤

    目录 STEP1 进入PyTorch官网查看安装版本和指令 STEP2 为PyTorch单独创建conda环境 STEP3 进入STEP2中创建的conda环境 STEP4 输入STEP1中的安装指令安装PyTorch STEP5 安装Ju
  • CSS层叠上下文、层叠等级、层叠顺序、z-index

    一个 片面 的理解 以往 由于自己使用z index的频率不大 所以对这个CSS属性存在比较片面的认识 一直认为z index就是用来描述定义一个元素在屏幕Z轴上的堆叠顺序 z index值越大在Z轴上就越靠上 也就是离屏幕观察者越近 最后
  • yarn、pnpm 的常用命令

    yarn 下载 npm i yarn g 查看版本 yarn version yarn v 初始化 package json yarn init yarn init y 下载包 yarn add axios 默认生产环境 yarn add
  • 【100%通过率 】【华为OD机试c++/java/python】MVP争夺战【 2022 Q4 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更

随机推荐

  • 1148.最大值

    include
  • Leetcode 刷题笔记(五) —— 链表篇之链表的基础操作和经典题目

    文章目录 系列文章目录 1 链表基本操作 707 设计链表 2 双指针迭代法 203 移除链表元素 206 反转链表 24 两两交换链表中的节点 3 双指针之快慢指针 19 删除链表的倒数第 N 个结点 160 相交链表 141 环形链表
  • Spring Boot CLI安装及快速入门示例

    Spring Boot CLI安装 Spring Boot是一个命令行工具 用于使用Spring进行快速原型搭建 它允许你运行Groovy脚本 这意味着你可以使用类Java的语法 并且没有那么多的模板代码 你没有必要为了使用Spring B
  • jpa|springboot|informix自定义SQL,条件判断

    jpa连mysql没什么说的 但是jpa连informix真的坑到家了 各种函数不支持 需求 在自定义sql的时候 需要判断参数是否为空 如果参数为空则不参与sql条件判断 就这么简单的一个需求 如果是jpa连mysql 那就用几个if判断
  • This application has no explicit mapping for /error, so you are seeing this as a fallback.

    Whitelabel Error Page This application has no explicit mapping for error so you are seeing this as a fallback Mon Nov 23
  • 矩阵打印(python实现)

    之前面试嵌入式软件的一道题 用c实现矩阵打印 考场上并没有写出来 之后总感觉自己写不出来也就没有去实现 在网上找也没能找到答案 结果这问题一直悬在脑海里 这才静下来想了想 发现并不难 便打算用python来实现 同时也是学习python之路
  • 基于PyTorch机器学习与深度学习实践应用与案例分析

    近年来 随着AlphaGo 无人驾驶汽车 医学影像智慧辅助诊疗 ImageNet竞赛等热点事件的发生 人工智能迎来了新一轮的发展浪潮 尤其是深度学习技术 在许多行业都取得了颠覆性的成果 另外 近年来 Pytorch深度学习框架受到越来越多科
  • azure 测试服务器性能,测试 Azure VM 网络吞吐量

    您现在访问的是微软AZURE全球版技术文档网站 若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站 请访问 https docs azure cn 带宽 吞吐量测试 NTTTCP 10 06 2020 本文内容 在
  • Python实现动态绘制爱心

    效果 源码 https download csdn net download x q x 87246985
  • 各种系统架构图及其简介

    各种系统架构图及其简介 转载请保留出处 不胜人生一场醉汇总 以下文字和架构图均在本人相关系统设计和架构方案中有所应用 原文出处 http space itpub net 6517 viewspace 609654 1 Spring架构图 S
  • QTextCodec中的setCodecForTr等终于消失了 (Qt5)

    在Qt4中 国内很多新手都喜欢 不分青红皂白地使用如下3行代码 QTextCodec setCodecForTr QTextCodec setCodecForCStrings QTextCodec setCodecForLocale 尽管之
  • linux修改host文件

    host文件位置 etc hosts vi etc hosts即可编辑 修改方式类似windows
  • 80X86微处理器堆栈指令

    压栈 弹栈指令 压栈 PUSH OP1 出栈 POP OP1 OP1可以是16位或32位的寄存器或存储器 压栈 弹栈数据存储过程 如SP 1000H BP 0FFFFH 执行下列指令后 DX SP STC Set CF 1 PUSH BP
  • 【Unity游戏开发】静态、动态合批与GPU Instancing

    https zhuanlan zhihu com p 356211912 前言 动态合批与静态合批其本质是对将多次绘制请求 在允许的条件下进行合并处理 减少cpu对gpu绘制请求的次数 达到提高性能的目的 目录 啥是合批 为啥要合批 调用D
  • socket通讯相互发送读取xml实例

    首先了解下socket通讯传输数据的特点 数据在网络传输时使用的都是字节流或字符流 Socket也不例外 所以我们发送数据的时候需要转换为字节发送 读取的时候也是以字节为单位读取 那么问题就在于socket通讯时 接收方并不知道此次数据有多
  • Python之Pandas绘图

    Pandas绘图
  • Qt --- 基本类

    位置和尺寸 在QT中我们常见的 点 线 尺寸 矩形 都被进行了封装 下面依次为大家介绍相关的类 QPoint QPoint类封装了我们常用用到的坐标点 x y 常用的 API如下 void QPoint setX int x void QP
  • CUDA8.0矩阵乘法例子解释(matrixMul.cpp)

    通过学习英伟达自带的例子matrixMul学CUDA库的使用 简略部分垃圾 只说核心代码 这个例子是实现 C A B的矩阵相乘 Use a larger block size for Fermi and above int block si
  • java:错误: 非法的表达式开始

    我写了这样一个代码 class Person private String name private int age Person System out println C name name age age Person String n
  • 记一道字节跳动的算法面试题

    来源公众号 苦逼的码农 作者 帅地 前几天有个朋友去面试字节跳动 面试官问了他一道链表相关的算法题 不过他一时之间没做出来 就来问了我一下 感觉这道题还不错 拿来讲一讲 题目 这其实是一道变形的链表反转题 大致描述如下 给定一个单链表的头节