news 2026/6/18 23:23:25

海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树

文章目录

  • 前言
  • 题目1 旋转链表
    • 算法分析
    • 代码实现
    • 实现细节与实战思考
  • 题目2 广度优先遍历打印二叉树问题
    • 题目背景与核心需求
    • 算法分析
    • 代码实现
    • 细节分析与实战思考
  • 总结

前言

考试方式是邮箱发送网址,进行牛客网线上笔试,四道编程题目,两道标准算法题目,两道实际应用型算法题,本篇博客分享前两道题。(四道题全部写在一起篇幅太大了)

题目1 旋转链表

题目链接:牛客 NC211 旋转链表

题目描述:

算法分析

链表的旋转操作若直接逐节点移动,会因重复遍历导致时间复杂度达到O ( k ∗ n ) O(k*n)O(kn),这在k较大时完全不可行。结合链表的特性,我们可将其转化为环形结构来简化操作:先遍历链表统计长度,将尾节点指向头节点形成环,此时旋转k个位置的本质,是找到新头节点的位置并断开环。由于旋转n次(n为链表长度)后链表会回到初始状态,因此我们只需计算k % n得到有效旋转次数,再从原头节点向后移动n - (k % n)个节点,该节点的下一个节点即为新头节点,断开此处的环即可完成旋转。

代码实现

/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */classSolution{public:ListNode*rotateLinkedList(ListNode*head,intk){// 边界情况:空链表或单节点链表无需旋转,直接返回原头节点if(head==nullptr||head->next==nullptr)returnhead;ListNode*cur=head;intsize=1;// 遍历链表统计长度,同时定位到尾节点while(cur->next!=nullptr){size++;cur=cur->next;}// 将尾节点指向头节点,构建环形链表cur->next=head;// 计算有效旋转次数,避免重复旋转k%=size;// 计算需要移动的步数,找到新头节点的前驱节点intmove_step=size-k;ListNode*mark=head;// 移动到新头节点的前驱节点for(inti=1;i<move_step;i++)mark=mark->next;// 确定新头节点并断开环形结构ListNode*newhead=mark->next;mark->next=nullptr;returnnewhead;}};

实现细节与实战思考

在实际解题过程中,边界条件的处理是避免出错的关键:空链表或仅有一个节点的链表,无论旋转多少次结果都不变,可直接返回原头节点。构建环形链表时,需确保遍历到真正的尾节点——即cur->nextnullptr的节点,而非仅遍历到最后一个有值节点。

关于步数计算的细节容易成为易错点:move_step表示从原头节点到新头节点前驱节点的步数,循环从1开始而非0,是因为初始时mark已指向原头节点(对应第1个节点),只需再移动move_step - 1次即可到达目标位置。例如链表长度为5、k=2时,move_step=3,循环执行2次,mark最终指向第3个节点,其下一个节点即为新头节点。

题目2 广度优先遍历打印二叉树问题

题目链接:牛客 JZ78 把二叉树打印成多行 [ 并不是原题但是比这道题简单,并不用分层,直接就是程序便利输入到一个数组中即可。
传送门:这道题和我今天做的每日一题很像,都是BFS解决二叉树层序遍历的问题,更加详细的解释可以看这篇博客 N 叉树的层序遍历
题目描述:

题目背景与核心需求

二叉树的层序遍历是广度优先搜索(BFS)的经典应用,本题要求将二叉树按层打印,每一层的节点值单独存入一个数组,最终返回二维数组结果。不同于普通的层序遍历,本题需要精准区分每一层的节点,避免不同层的节点混在一起,这就要求在遍历过程中对每一层的节点数量进行精准统计。

算法分析

广度优先遍历依赖队列实现,核心思路是利用队列的“先进先出”特性,逐层处理节点。在遍历开始时,先将根节点入队;每一轮循环中,先记录当前队列的大小(即当前层的节点数),再依次取出该数量的节点,将节点值存入当前层的数组,同时将每个节点的左右子节点(若存在)入队。当当前层的所有节点处理完毕后,将该层的数组存入结果集,重复此过程直到队列为空。这种方式能确保每一轮循环仅处理一层节点,天然实现了层与层的分隔。

代码实现

/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */#include<queue>#include<vector>classSolution{public:vector<vector<int>>Print(TreeNode*pRoot){// 存储最终的分层打印结果vector<vector<int>>ret;// 边界条件:空树直接返回空结果if(pRoot==nullptr)returnret;// 队列用于存储待处理的节点,实现广度优先遍历queue<TreeNode*>q;q.push(pRoot);// 队列非空时,说明还有未处理的节点while(!q.empty()){// 记录当前层的节点数量,这是分层的关键intlevel_size=q.size();// 存储当前层的节点值vector<int>level_nums;// 遍历当前层的所有节点while(level_size--){TreeNode*tmp=q.front();level_nums.push_back(tmp->val);q.pop();// 左子节点存在则入队,为下一层遍历做准备if(tmp->left!=nullptr)q.push(tmp->left);// 右子节点存在则入队if(tmp->right!=nullptr)q.push(tmp->right);}// 将当前层的结果存入最终结果集ret.push_back(level_nums);}returnret;}};

细节分析与实战思考

队列的使用是本题的核心,其“先进先出”的特性恰好匹配层序遍历“从上到下、从左到右”的顺序。在实际解题时,level_size的取值时机尤为重要——必须在处理当前层节点前获取队列大小,因为处理节点的过程中会将下一层节点入队,若在循环中获取会导致统计的节点数包含下一层内容。

例如对于一棵三层二叉树,初始时队列仅含根节点,level_size=1,处理完根节点后,其左右子节点入队,此时队列大小变为2;第二轮循环中level_size=2,处理完这两个节点后,它们的子节点入队,队列大小变为4,以此类推。这种方式能精准划分每一层的节点,避免层序混乱。

此外,边界条件的处理不可忽视:空树的情况下直接返回空的二维数组,避免后续操作中访问空指针导致程序崩溃。在遍历节点时,需先判断左右子节点是否存在,再将其入队,这是防止无效节点入队的必要步骤。

总结

  1. 旋转链表问题的核心是通过构建环形链表简化旋转操作,结合取模运算优化旋转次数,同时需精准定位新头节点的前驱节点以断开环形结构,边界条件(空链表、单节点链表)的处理是避免错误的关键。
  2. 二叉树分层打印的核心是利用队列实现广度优先遍历,通过记录每一轮循环前的队列大小区分不同层节点,确保每一轮仅处理当前层节点,子节点入队的时机和顺序决定了遍历的正确性。
  3. 两道题目均体现了“先优化问题模型,再处理细节”的解题思路:旋转链表将多次旋转转化为环形结构的一次断开,二叉树遍历将“分层”需求转化为队列大小的统计,这种思路能有效降低时间复杂度,提升代码效率。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 8:52:38

AgentCore新增四大功能,为Agent落地扫清困难

re:Invent 2025&#xff0c;亚马逊云科技带来一系列重磅发布&#xff0c;掀起全球云计算创新浪潮。为帮助开发者们深入了解各项技术创新成果、上手使用最新功能&#xff0c;特推出本系列解读文章&#xff0c;助您探索云上未来的无限可能&#xff01;re:Invent 2025&#xff0c;…

作者头像 李华
网站建设 2026/6/15 15:53:58

Qwen2.5-7B角色扮演实战:打造个性化聊天机器人

Qwen2.5-7B角色扮演实战&#xff1a;打造个性化聊天机器人 1. 引言&#xff1a;为什么选择Qwen2.5-7B做角色扮演&#xff1f; 随着大语言模型在对话理解、上下文建模和生成能力上的持续进化&#xff0c;角色扮演型聊天机器人正从“玩具级Demo”迈向“可落地的智能体应用”。在…

作者头像 李华
网站建设 2026/6/15 14:23:42

Qwen2.5-7B实战:构建多语言翻译API服务

Qwen2.5-7B实战&#xff1a;构建多语言翻译API服务 随着全球化业务的不断扩展&#xff0c;多语言支持已成为现代应用不可或缺的能力。传统翻译工具在语义连贯性、上下文理解与专业术语处理方面存在局限&#xff0c;而大语言模型&#xff08;LLM&#xff09;的兴起为高质量翻译…

作者头像 李华
网站建设 2026/6/9 21:16:42

Qwen2.5-7B实战:如何实现8K tokens长文本生成

Qwen2.5-7B实战&#xff1a;如何实现8K tokens长文本生成 1. 引言&#xff1a;为何选择Qwen2.5-7B进行长文本生成&#xff1f; 1.1 大模型时代对长上下文的迫切需求 随着大语言模型在内容创作、代码生成、数据分析等场景中的深入应用&#xff0c;长文本生成能力已成为衡量模型…

作者头像 李华
网站建设 2026/6/8 15:37:10

Qwen2.5-7B性能指南:处理高并发请求的优化

Qwen2.5-7B性能指南&#xff1a;处理高并发请求的优化 1. 背景与挑战&#xff1a;大模型推理中的高并发瓶颈 随着大语言模型&#xff08;LLM&#xff09;在实际业务场景中的广泛应用&#xff0c;从智能客服到自动化内容生成&#xff0c;用户对模型响应速度和系统吞吐能力的要…

作者头像 李华