当前位置: 首页 > news >正文

剑指offer题单 9.14

从尾到头打印链表/图书整理1

LCR 123. 图书整理 I - 力扣(LeetCode)

一、翻转链表解法

通过先翻转链表,最后遍历翻转后的链表收集结果。

newhead相当于指向head的前一个地方让他为nullptr,cur记录当前节点,在遍历的时候完成相邻两节点的翻转,在翻转之前需要通过新的指针来保存cur->next,防止改变next指向的时候节点丢失

vector<int> reverseBookList(ListNode* head) {ListNode* newhead = nullptr;ListNode* cur = head;while(cur){ListNode* tmp = cur->next;//记录下一个节点cur->next = newhead;newhead = cur;cur = tmp;}vector<int> result;cur = newhead;while(cur){result.push_back(cur->val);cur = cur->next;}return result;}

二、递归解法

从头到尾遍历链表,最后到了最后一个节点,通过递归进行收集结果

    vector<int> res;//收集结果vector<int> reverseBookList(ListNode* head) {travsel(head);return res;}void travsel(ListNode* head){if(head==nullptr)   return;travsel(head->next);res.push_back(head->val);}

重建二叉树/推理二叉树

LCR 124. 推理二叉树 - 力扣(LeetCode)

首先我们思考前中序的遍历结果,前序遍历是中左右的顺序去遍历,所以每个树的第一个元素,就是这颗树的根节点,我们得知了这个树的根节点,接下来要去划分左右子树。中序遍历正好是根据左中右的顺序去遍历,那么我们只需要在中序遍历中确定这个根节点的位置也就是左右子树的分割点,我们记录下来,并将左右子树的下标记录,在前序遍历中以相同的方式进行划分,最后递归就好了。

这里的参数可以传数组,就是每次把左右子树的元素都添加到其中,但是这样就会耗费不必要的空间,因此这里采用下标来完成划分左右子树区间的方式。

TreeNode* deduceTree(vector<int>& preorder, vector<int>& inorder) {if(preorder.size()==0||inorder.size()==0)   return nullptr;return travserl(preorder, 0, preorder.size(), inorder, 0, inorder.size());}TreeNode* travserl(vector<int>& preorder, int preleft, int preright, vector<int>& inorder,int inoleft, int inoright){if(preleft==preright)   return nullptr;//每次找前序遍历中的第一个点,这就是每个树的根节点TreeNode* root = new TreeNode(preorder[preleft]);int cur = preorder[preleft];//如果前序遍历这是最后一个节点,那么就可以直接返回rootif(preright-preleft==1) return root;int del = 0;//查找这个根节点在中序遍历中的位置for(del = inoleft;del<inoright;del++){if(inorder[del]==cur)   break;}//切割中序数组,分割中序左数组//均按照左闭右开区间去分割int leftinobegin = inoleft;int leftinoend = del;//中序右区间int rightinobegin = del+1;int rightinoend = inoright;//切割前序数组,分割前序左数组int leftprebegin = preleft+1;int leftpreend = preleft+1+leftinoend-leftinobegin;//分割前序右数组int rightprebegin = preleft+1+leftinoend-leftinobegin;int rightpreend = preright;root->left = travserl(preorder, leftprebegin, leftpreend, inorder, leftinobegin, leftinoend);root->right = travserl(preorder, rightprebegin, rightpreend, inorder, rightinobegin, rightinoend);return root;}

用两个栈实现队列/图书整理2

首先仔细观察题目,题目中说,书是按照从下往上放的顺序,并且每次只能取最上面的一本,这不就是栈吗。再看怎么要求我们每次取出最先放进去的书,就是要求我们实现一个队列的先进先出的操作。

最后就是如何通过两个栈去模拟队列的出队入队操作

那么我们是不是可以用其中一个栈,就按照正常的方式进行push操作,当要求取出元素的时候,我们通过遍历将队列1的元素清空,并push到队列2中,这样队列2中的栈顶元素就是最早放进去的书,我们将他pop就可以了。这里有三个情况:

1、队列1为空队列2为空,说明没有书可以返回,就返回-1

2、队列1不为空队列2为空,说明需要重新遍历push

3、队列1不为空队列2不为空,说明在队列2中还有更早放入的书,不需要进行遍历将1中的现元素push到2中,依然从队列2中进行pop返回即可

class CQueue {
public:stack<int> st1;stack<int> st2;CQueue() {}void appendTail(int value) {st1.push(value);}int deleteHead() {if(st1.size()==0&&st2.size()==0)    return -1;if(st2.size()!=0){int res = st2.top();st2.pop();return res;}else{int st1size = st1.size();while(st1size--){st2.push(st1.top());st1.pop();}int res = st2.top();st2.pop();return res;}}
};

文章转载自:

http://SdL7l9ZX.knryp.cn
http://EOY8xSz2.knryp.cn
http://sazgnQlJ.knryp.cn
http://zUg99UAA.knryp.cn
http://ZYNJkjZy.knryp.cn
http://cNHS3hbX.knryp.cn
http://sG13YxmP.knryp.cn
http://s2sVUb62.knryp.cn
http://pBmPrqVo.knryp.cn
http://LwmvrPZR.knryp.cn
http://hIEgBYYC.knryp.cn
http://A6k4bYfa.knryp.cn
http://ThoCmSux.knryp.cn
http://RoiIQnYI.knryp.cn
http://d8JgFonr.knryp.cn
http://HpaGMaep.knryp.cn
http://SdKgxrUm.knryp.cn
http://tOinPLiD.knryp.cn
http://SxjqqX2Z.knryp.cn
http://gmOJf1dH.knryp.cn
http://hxLT7SFV.knryp.cn
http://5wDnaKnb.knryp.cn
http://atyqzPnO.knryp.cn
http://ihXiqt5W.knryp.cn
http://DqBWY1pq.knryp.cn
http://ZEBxLh5r.knryp.cn
http://28T2AoTq.knryp.cn
http://0pGbeMlg.knryp.cn
http://GGpZ79Sv.knryp.cn
http://cmOlARfq.knryp.cn
http://www.dtcms.com/a/387322.html

相关文章:

  • IIS 站点 http 请求412问题解决
  • Web前端入门:从零开始做网站(视频教程)
  • 本地--Oracle表被锁了该如何处理
  • Doris与Clickhouse分析
  • ByteDance字节前端一面
  • 卫星通信+AI双核驱动,遨游智能三防手机连得上、会思考
  • 云手机通道具有哪些方面的优势
  • 前端实验(二)初识Vue
  • html.
  • 【人工智能与机器人研究】基于多模态的管道非接触式磁记忆检测方法研究
  • DIY Linux 桌面:让电脑再次快速运行
  • MySQL基础入门:开启数据库之旅
  • C++开发者如何开发自己的第一个mac应用(xcode + XIB + Objective-C C++)
  • LabVIEW风洞测试系统稳定性措施
  • Spring Boot 深入剖析:SpringBoot的启动流程
  • 机器人工具标定-记录一下-待验证(没数据)
  • 1.0 Labview中事件结构在while循环中使用注意事项(超时时间)
  • 微服务通信
  • 重定向、命令行判断、管道、正则三剑客
  • 破垄断!东土科技与海光信息联合发布全国产化工控系统,筑牢工业安全新底座
  • 一场史诗级的冒险——Docker命令大航海!
  • 基于 Node.js 的后端框架:NestJS 和 Express(二)
  • 大数据时代时序数据库选型指南:为何Apache IoTDB成优选——从技术架构与行业实践深度剖析
  • HBase 实战:3 步掌握基于 Rowkey 的数据更新技巧
  • 【Android】Jetpack Media3 播放音频文件
  • 算法 --- 队列 + 宽搜(BFS)
  • 苹果手机怎么导出App数据目录,iOS文件管理、应用沙盒访问、日志缓存导出与性能调试实战(uni-app开发者指南)
  • Java 设计模式——策略模式:从 3 种写法到 SpringBoot 进阶
  • JVM:性能调优的理解
  • AR眼镜在巡检业务中的软件架构设计|阿法龙XR云平台