专题:剑指offer
链表
JZ6 从尾到头打印链表
思路:先顺序输出到栈里面 然后再以此从栈顶弹出即可
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
#include <vector>
class Solution {
public:vector<int> printListFromTailToHead(ListNode* head) {stack<int> st;while(head!=nullptr){st.push(head->val);head=head->next;}vector<int> res; while(!st.empty()){res.push_back(st.top());st.pop();}return res;}
};
JZ24 反转链表
思路:借助虚拟头结点进行头插法
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param head ListNode类 * @return ListNode类*/ListNode* ReverseList(ListNode* head) {// write code here//头插法ListNode* dummy = new ListNode(0);ListNode* cur = head;while(cur!=nullptr){ListNode* next = cur->next;//头插法cur->next=dummy->next;dummy->next=cur;cur = next;}ListNode* res = dummy->next;delete dummy;return res;}
};
JZ25 合并两个排序的链表
方法一:迭代法
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类*/// ListNode* dfs(ListNode* pHead1, ListNode* pHead2){// } ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {// write code here// 迭代写法ListNode* dummp=new ListNode(0);ListNode*pre =dummp;while(pHead1!=nullptr&&pHead2!=nullptr){if(pHead1->val<pHead2->val){ListNode* temp = new ListNode(pHead1->val);pre->next=temp;pre=temp;pHead1=pHead1->next;}else{ListNode* temp = new ListNode(pHead2->val);pre->next=temp;pre=temp;pHead2=pHead2->next;}}while(pHead1!=nullptr){ListNode* temp = new ListNode(pHead1->val);pre->next=temp;pre=temp;pHead1=pHead1->next;}while(pHead2!=nullptr){ListNode* temp = new ListNode(pHead2->val);pre->next=temp;pre=temp;pHead2=pHead2->next;}ListNode* res=dummp->next;delete dummp; return res;}
};
方法二 递归:
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类*/// ListNode* dfs(ListNode* pHead1, ListNode* pHead2){// } ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {// write code hereif(pHead1==nullptr && pHead2==nullptr){return nullptr;}else if(pHead1==nullptr && pHead2!=nullptr){return pHead2;}else if(pHead1!=nullptr && pHead2==nullptr){return pHead1;}// if(pHead1->val<pHead2->val){//ListNode* next1=pHead1->next;// pHead1->next=nullptr;pHead1->next=Merge(next1,pHead2);return pHead1;}ListNode* next2=pHead2->next;// pHead2->next=nullptr;pHead2->next=Merge(pHead1,next2);return pHead2;}
};
JZ52 两个链表的第一个公共结点
方法一:循环遍历两个链表
方法二·:遍历长链表 先快走几步 后面和端链表一起同步走
方法一
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {ListNode* cur1 = pHead1;ListNode* cur2 = pHead2;while(cur1!=cur2){cur1= cur1==nullptr?pHead2:cur1->next;cur2= cur2==nullptr?pHead1:cur2->next;}return cur2;}
};
方法二
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {// 普通解法 就是先走多少步ListNode* cur1 = pHead1;int len1 =0;while(cur1!=nullptr){cur1=cur1->next;len1++;}ListNode* cur2 = pHead2;int len2 =0;while(cur2!=nullptr){cur2=cur2->next;len2++;}int gap =abs(len1-len2);// 保证pHead1指向的是长的链表if(len1<len2){ListNode* temp=pHead1;pHead1=pHead2;pHead2=temp;}cur1 = pHead1;while(gap--){cur1=cur1->next;}cur2 = pHead2;while(cur1!=nullptr){if(cur1==cur2){return cur1;}cur1=cur1->next;cur2=cur2->next;}return cur2;}
};
JZ23 链表中环的入口结点
思路:快慢指针 循环体内 快指针每次走两步 慢指针每次走一步 能够相遇也就是说明有环 然后 慢指针从头开始 另外一个指针从相遇节点开始 判断是否再次相遇 不相遇 这两个指针 每次走一步 走到相遇点就是环入口。
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead) {ListNode* slow,*fast;slow=fast=pHead;while(fast!=nullptr&&fast->next!=nullptr){slow=slow->next;fast=fast->next->next;if(slow==fast){// 存在环ListNode* slow = pHead;ListNode* cur = fast;while(slow!=cur){slow=slow->next;cur=cur->next;}return cur;}}return nullptr;}
};
JZ35 复杂链表的复制
参考视频
思路:使用散列表 如下
unordered_map<RandomListNode*,RandomListNode*> mymap;RandomListNode* cur = pHead;while(cur!=nullptr){mymap[cur]=new RandomListNode(cur->label);cur=cur->next;}
此时节点已经构造出来了 开始准备映射节点的next,以及random关系
完整代码:
/*
struct RandomListNode {int label;struct RandomListNode *next, *random;RandomListNode(int x) :label(x), next(NULL), random(NULL) {}
};
*/
class Solution {// RandomListNode* dfs(RandomListNode* pHead) {// if (pHead == nullptr) {// return nullptr;// }// RandomListNode* newnode = new RandomListNode(pHead->label);// cout << "val:" << pHead->label << endl;// newnode->next = dfs(pHead->next);// newnode->random = dfs(pHead->random);// return newnode;// }public:RandomListNode* Clone(RandomListNode* pHead) {// unordered_map<RandomListNode*,RandomListNode*> mymap;RandomListNode* cur = pHead;while(cur!=nullptr){mymap[cur]=new RandomListNode(cur->label);cur=cur->next;}cur = pHead;while(cur!=nullptr){if(cur->next){mymap[cur]->next=mymap[cur->next];}if(cur->random){mymap[cur]->random=mymap[cur->random];}cur=cur->next;}return mymap[pHead];}
};
Z76 删除链表中重复的结点
思路:这里使用率pre以及cur 每次看cur以及cur->next是否相等 不相等 移动pre以及cur 如果相等 移动cur到本次循环不相等的地方
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {ListNode* dummy = new ListNode(0);dummy->next = pHead;ListNode*pre = dummy;ListNode*cur = pHead;while(cur!=nullptr){if(cur->next==nullptr || cur->next->val != cur->val){// 准备下一次循环 pre/cur 都需要移动一格pre=cur;cur=cur->next;}else{while(cur->next!=nullptr && cur->val ==cur->next->val){cur=cur->next;}ListNode* nextnode = cur->next;// 直接跳过重复的节点 也就是pre->next直接next到不重复的节点(模拟删除) 注意pre没有移动 移动的是curpre->next = nextnode;cur = nextnode;}}return dummy->next;}
};
JZ18 删除链表的节点
方法一:迭代法
方法二:递归
方法一
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param head ListNode类 * @param val int整型 * @return ListNode类*/ListNode* deleteNode(ListNode* head, int val) {// write code hereif(head==nullptr){return nullptr;}if(head->val!=val){head->next=deleteNode(head->next,val);return head;}return deleteNode(head->next,val);}
};
方法二:
/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param head ListNode类 * @param val int整型 * @return ListNode类*/ListNode* deleteNode(ListNode* head, int val) {// write code hereListNode* dummy =new ListNode(0);dummy->next=head;ListNode* pre = dummy;ListNode* cur = head;while(cur!=nullptr){if(cur->val==val){// 你不需要 free 或 delete 被删除的节点 题目已经指出来// ListNode* delenode = cur;cur=cur->next;pre->next = cur;}else{pre=cur;cur=cur->next;}}return dummy->next;}
};
相关文章:
专题:剑指offer
链表 JZ6 从尾到头打印链表 思路:先顺序输出到栈里面 然后再以此从栈顶弹出即可 /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ #include …...
DeepSeek 部署过程中的问题
文章目录 DeepSeek 部署过程中的问题一、部署扩展:docker 部署 DS1.1 部署1.2 可视化 二、问题三、GPU 设置3.1 ollama GPU 的支持情况3.2 更新 GPU 驱动3.3 安装 cuda3.4 下载 cuDNN3.5 配置环境变量 四、测试 DeepSeek 部署过程中的问题 Windows 中 利用 ollama 来…...
DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 Ollama 🦋 下载 Ollama🦋 选择模型🦋 运行模型🦋 使用 && 测试 二:🔥 Chat…...
应急场景中的数据融合与对齐
1. 概述 在应急管理中,快速、准确地掌握现场状况、实时监控灾情并进行决策至关重要。各类数据(如卫星影像、无人机图像、激光雷达点云、地理信息系统(GIS)数据、传感器数据、社交媒体信息、移动终端数据等)具有来源广泛、格式多样、时空特性不同等特点。如何将这些异构数…...
手机上运行AI大模型(Deepseek等)
最近deepseek的大火,让大家掀起新一波的本地部署运行大模型的热潮,特别是deepseek有蒸馏的小参数量版本,电脑上就相当方便了,直接ollamaopen-webui这种类似的组合就可以轻松地实现,只要硬件,如显存…...
Mellanox网卡信息查看
1、查看Mellanox网卡的SN(序列号)和PN mstvpd 04:00.0或者lspci -s 04:00.0 -vvv来自https://enterprise-support.nvidia.com/s/article/MLNX2-117-2532kn 2、查看Mellanox网卡驱动、固件版本 ethtool -i ens6np0...
【漫画机器学习】083.安斯库姆四重奏(Anscombe‘s quartet)
安斯库姆四重奏(Anscombes Quartet) 1. 什么是安斯库姆四重奏? 安斯库姆四重奏(Anscombes Quartet)是一组由统计学家弗朗西斯安斯库姆(Francis Anscombe) 在 1973 年 提出的 四组数据集。它们…...
TCP | RFC793
注:本文为 “ RFC793” 相关文章合辑。 RFC793-TCP 中文翻译 编码那些事儿已于 2022-07-14 16:02:16 修改 简介 翻译自: RFC 793 - Transmission Control Protocol https://datatracker.ietf.org/doc/html/rfc793 TCP 是一个高可靠的主机到主机之间…...
2025蓝桥杯JAVA编程题练习Day2
1.大衣构造字符串 问题描述 已知对于一个由小写字母构成的字符串,每次操作可以选择一个索引,将该索引处的字符用三个相同的字符副本替换。 现有一长度为 NN 的字符串 UU,请帮助大衣构造一个最小长度的字符串 SS,使得经过任意次…...
《解锁GANs黑科技:打造影视游戏的逼真3D模型》
在游戏与影视制作领域,逼真的3D模型是构建沉浸式虚拟世界的关键要素。从游戏中栩栩如生的角色形象,到影视里震撼人心的宏大场景,高品质3D模型的重要性不言而喻。随着人工智能技术的飞速发展,生成对抗网络(GANs…...
es match 可查 而 term 查不到 问题分析
es 匹配逻辑 根本:es 的匹配是基于token 的。检索的query和目标字段在token 层级上有交集才能检索成功。对同样的文本,使用不同的分词器,所得token 不同。es 默认的analyzer(分词器)是standard模式,即按字切分。 基本上…...
【OpenCV实战】基于 OpenCV 的多尺度与模板匹配目标跟踪设计与实现
文章目录 基于 OpenCV 的模板匹配目标跟踪设计与实现1. 摘要2. 系统概述3. 系统原理3.1 模板匹配的基本原理3.2 多尺度匹配 4. 逻辑流程4.1 系统初始化4.2 主循环4.3 逻辑流程图 5. 关键代码解析5.1 鼠标回调函数5.2 多尺度模板匹配 6. 系统优势与不足6.1 优势6.2 不足 7. 总结…...
将有序数组转换为二叉搜索树(力扣108)
这道题需要在递归的同时使用双指针。先找到一个区间的中间值,当作子树的父节点,再递归该中间值的左区间和右区间,用于生成该父节点的左子树和右子树。这就是此题的递归逻辑。而双指针就体现在每一层递归都要使用左指针和右指针来找到中间值。…...
开放式TCP/IP通信
一、1200和1200之间的开放式TCP/IP通讯 第一步:组态1214CPU,勾选时钟存储器 第二步:防护与安全里面连接机制勾选允许PUT/GET访问 第三步:添加PLC 第四步:点击网络试图,选中网口,把两个PLC连接起…...
S4 HANA (递延所得税传输)Deferred Tax Transfer - S_AC0_52000644
本文主要介绍在S4 HANA OP中S4 HANA (递延所得税传输)Deferred Tax Transfer - S_AC0_52000644的后台配置及前台操作。具体请参照如下内容: 目录 Deferred Tax Transfer - S_AC0_52000644 1. 后台配置 1.1 Business Transaction Events激活- FIBF 2. 前台操作 …...
如何从0开始做自动化测试?
自动化测试是使用软件工具在应用程序上自动运行测试的过程,无需任何人为干预。这可以通过减少手动测试的需要来保存时间并提高软件开发过程的效率。由于人为错误或不一致性,手动测试可能容易出错,这可能导致错误未被检测到。自动化测试通过…...
DeepSeek服务器繁忙问题的原因分析与解决方案
一、引言 随着人工智能技术的飞速发展,DeepSeek 等语言模型在众多领域得到了广泛应用。然而,在春节这段时间的使用过程中,用户常常遭遇服务器繁忙的问题,这不仅影响了用户的使用体验,也在一定程度上限制了模型的推广和…...
C#,入门教程(10)——常量、变量与命名规则的基础知识
上一篇: C#,入门教程(09)——运算符的基础知识https://blog.csdn.net/beijinghorn/article/details/123908269 C#用于保存计算数据的元素,称为“变量”。 其中一般不改变初值的变量,称为常变量,简称“常量”。 无论…...
宏观经济:信贷紧缩与信贷宽松、通货膨胀与通货紧缩以及经济循环的四个周期
目录 信贷紧缩与信贷宽松信贷紧缩信贷宽松信贷政策对经济影响当前政策环境 通货膨胀与通货紧缩通货膨胀通货紧缩通货膨胀与通货紧缩对比 经济循环的四个周期繁荣阶段衰退阶段萧条阶段复苏阶段经济周期理论解释经济周期类型 信贷紧缩与信贷宽松 信贷紧缩 定义:金融…...
分层解耦.
三层架构 controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据 service:业务逻辑层,处理具体的业务逻辑 dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改…...
MySQL 5.7.32 Online DDL避坑指南:如何避免主从延迟和锁等待?
MySQL 5.7.32 Online DDL实战避坑:高并发场景下的零停机表结构变更策略 在数据库运维的日常工作中,表结构变更(DDL)操作总是让人又爱又恨。特别是当面对千万级数据表时,一个简单的ALTER TABLE操作就可能引发连锁反应—…...
扩散模型技术演进三部曲:从理论奠基到产业落地的核心突破
1. 扩散模型:一场关于"破坏与重建"的技术革命 想象你正在教一个孩子画画,但用的是一种特别的方式:先给他看一张完整的画作,然后你不断地在上面涂抹修改,直到画作变成一团杂乱无章的线条。接着,你…...
MySQL高频面试题(2026最新版):覆盖90%考点,小白也能直接背
很多开发者备考时,要么盲目刷题、记不住重点,要么只背答案、不懂原理,面试时被面试官追问一句就卡壳。其实MySQL面试没有那么复杂,核心考点就那么多,只要吃透高频题、理解底层逻辑,就能从容应对。本文整理了…...
如何使用4个经过验证的技巧将Android联系人备份到Mac
联系人无疑是我们智能手机上最重要的数据。一旦失去联系,我们就会与这个世界上最亲爱的人失去联系;也许他们是家人、爱人、朋友、同学、同事、学生等。因此,联系人备份对我们来说非常重要。与将iPhone联系人备份到Mac相对容易不同,…...
提升GitHub访问效率的实用方案
提升GitHub访问效率的实用方案 【免费下载链接】gh-proxy github release、archive以及项目文件的加速项目 项目地址: https://gitcode.com/gh_mirrors/gh/gh-proxy 诊断连接瓶颈 检测网络延迟指标 准备工作:确保系统已安装网络诊断工具(Linux默…...
Fish Speech 1.5API文档增强:OpenAPI 3.0规范生成与Swagger UI集成
Fish Speech 1.5 API文档增强:OpenAPI 3.0规范生成与Swagger UI集成 1. 引言:为什么需要API文档增强? 在实际开发中,我们经常遇到这样的场景:团队新成员需要快速了解API接口,第三方开发者想要集成语音合成…...
OpenClaw小龙虾初体验【安装学习】
文章目录一、前言二、安装三、360安全龙虾四、腾讯龙虾4.1 文件移动4.2 应用分析4.3 Docker失败原因一、前言 最近小龙虾很火,不禁能说还能做,本质就类似木马,获取电脑权限,不禁能操作各应用还能联动外接设备。 那肯定要学习一下…...
循环冷却水流量示意图设计 建筑水流量示意图绘制教程
一、引言 在建筑给排水、暖通空调及工业循环水系统设计中,循环冷却水流量示意图与建筑水流量示意图是核心技术图纸之一,其作用是直观呈现水流路径、管径规格、流量分配、设备连接关系及压力节点参数,为系统施工、调试、运维及故障排查提供可…...
企业AI定制开发:以工业场景为核心,赋能全行业数智化转型
在人工智能与实体经济深度融合的趋势下,标准化AI产品难以适配企业差异化业务流程,定制化AI开发成为企业数智化转型的关键路径。山东向量空间人工智能科技有限公司依托JBoltAI企业级Java AI应用开发框架,聚焦工业领域AI改造,同时为…...
复旦微FMQL平台:memorytest工程实战指南与DDR稳定性验证
1. 从Procise导出memorytest工程 第一次接触复旦微FMQL平台时,我也被各种工程文件搞得晕头转向。memorytest工程作为内存测试的基础工具,其实导出过程比想象中简单得多。在Procise界面中找到memtest选项,就像在Windows资源管理器里找文件夹一…...
