专题:剑指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)(持久层),负责数据访问操作,包括数据的增、删、改…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
