leetcode双指针合集

在这里插入图片描述

27. 移除元素

class Solution {
public:int removeElement(vector<int>& nums, int val) {/**思路:使用快慢指针,快指针正常往后移动,并将获取的值给慢指针,但是当快指针所指向的值是val的时候慢指针便不再更新;**/    int slowIndex = 0;for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {if(nums[fastIndex] != val) {nums[slowIndex] = nums[fastIndex];slowIndex++;}}return slowIndex; }
};

344. 反转字符串

class Solution {
public:void reverseString(vector<char>& s) {for(int i = 0,j = s.size()-1; i < s.size()/2; i++,j--) {swap(s[i],s[j]);}}
};

剑指 Offer 05. 替换空格


class Solution {
public:string replaceSpace(string s) {/**思路:1.双指针(一个指针指向旧的字符串末尾ptr1,一个指针指向扩容后的字符串末尾ptr2)2.对原字符串的扩容,因为%20是占3个空格的,所以要在原来一个空格基础上进行扩容3.当遇到不是空格的时候,两个指针指向的字符就正常赋值,如果当ptr1指向空格的时候ptr2就前面的3个空格 填上%20*/int count = 0;//记录空格数int oldSize = s.size();for(int i = 0; i < s.size(); i++) {if(s[i] == ' '){count++;}}s.resize(oldSize+2*count);int newSize = s.size();//i和j模拟指针for(int i = oldSize-1,j = newSize-1; i>=0; i--,j--) {if(s[i] == ' '){s[j] = '0';s[j-1] = '2';s[j-2] = '%';j = j-2;}else{s[j] = s[i];} }return s;}
};

151. 翻转字符串里的单词


class Solution {
public:/**思路:1.去除空格(字符串前面的空格 字符串中间冗余的空格 字符串后面的空格)2.反转字符串3.将每个单词进行反转**/void removespacing(string &s) {int slowIndex = 0,fastIndex = 0;//定义快慢指针(最终慢指针为去完冗余空格的字符串)//去除字符串前面的空格while(s[fastIndex] == ' '){fastIndex++;}for( ; fastIndex < s.size(); fastIndex++) {//去除冗余的空格if(fastIndex-1 > 0 &&s[fastIndex-1] == s[fastIndex] && s[fastIndex] == ' '){continue;}else {s[slowIndex] = s[fastIndex];slowIndex++;}            }//去除末尾的空格(如果字符串的末尾有多个空格的话  上方只能处理到末尾只有一个空格)if(slowIndex-1 > 0 && s[slowIndex - 1] == ' '){s.resize(slowIndex-1);}else{s.resize(slowIndex);}}void reverseStr(string &s,int start,int end){for(int i = start,j = end; i < j; i++,j--) {swap(s[i],s[j]);}}string reverseWords(string s) {removespacing(s);reverseStr(s,0,s.size() - 1);for(int i = 0; i < s.size(); i++) {int j = i;//找到空格while(j < s.size() && s[j] != ' ') {j++;}reverseStr(s,i,j-1);//这里j-1是因为s[j]已经表示的是空格了i = j;}return s;}
};

206. 反转链表


class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* temp;//存放临时结点ListNode* cur = head;ListNode* pre = NULL;while(cur) {temp = cur->next;cur->next = pre;//调转指针pre = cur;//往后移动一个结点cur =  temp;}return pre;//当cur指向5的时候 下一个就指向空  那么pre = cur 则就表示前指针表示指向的是5}
};

19. 删除链表的倒数第 N 个结点

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {/**思路:1.双指针(慢指针p1,快指针p2)2.要删除倒数第n个结点,也就是要正向删除 第(总的节点数 - n)个结点 3.为了处理倒数问题,先让p2往后移动n个结点,(这时候p2还剩下(总的节点数-n = sum)),那么此时p1和p2一块移动,等到p2指向末尾的时候,p1也就指向要删除的结点*/ListNode* fakeNode = new ListNode(0);fakeNode->next = head;ListNode* slowNode = fakeNode;//慢指针ListNode* fastNode = fakeNode;//快指针while(n-- && fastNode != NULL) {fastNode = fastNode->next;}fastNode = fastNode->next;//让其再快一格是为了当快指针到末尾的时候,慢指针指向要删除结点的//的前一个结点              while(fastNode != NULL){fastNode = fastNode->next;slowNode = slowNode->next;}slowNode->next = slowNode->next->next;return fakeNode->next;}
};

18. 四数之和

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int> >ans;vector<int> v;sort(nums.begin(),nums.end());for(int i = 0; i < nums.size(); i++) {if(i > 0 && nums[i-1] == nums[i]) {continue;}for(int j = i+1; j < nums.size(); j++) {if(j-1 > i &&nums[j-1] == nums[j]){//这里的j-1大于i主要考虑的是我们去重复的是从continue;                    //j开始指向的元素}int left = j+1;int right = nums.size() - 1;while(left < right) {if(nums[i]+nums[j] > target - (nums[left]+nums[right])) right--;else if(nums[i]+nums[j] < target - (nums[left]+nums[right])) left++;else {v.push_back(nums[i]);v.push_back(nums[j]);v.push_back(nums[left]);v.push_back(nums[right]);ans.push_back(v);//去重处理while(left < right && nums[right-1] == nums[right]) right--;while(left > right && nums[left+1] == nums[left]) left++;//换下一组right--;left++;v.clear();}} }}return ans;}
};

15. 三数之和

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {/**思路:1.我们将所有元素进行升序处理(这样处理的话,我们可以知道当前面的元素大于0的时候,那么便一定不会出现 a+b+c=0 2.这里我们设置三个指针(模拟的) 第一个指针(i)指向数组的第一个元素,第二个指针(left)指向数组的第二个元素,第三个指针(right)指向数组的最后的元素3.nums[i] + nums[left] + nums[right] > 0; right-- ,i和left不动nums[i] + nums[left] + nums[right] < 0; left++,i和right不动nums[i] + nums[left] + nums[right] = 0;left++,right--,i也移动一个单位当我们找到一组答案的时候,就要同时移动三个指针;因为当我们找到一组答案的时候,如果不移动i,只移动left和right,因为是升序的,那么的话nums[left] + nums[right] 只会更小与nums[i]相加也不会等于0;如果我们想要最终的和为0,那么的话nums[i] < 0,nums[left] < 0,nums[right] > 0,那么往后移动i,如果和为0的话 nums[left] + nums[right]的结果只会更小因此我们每确定一组答案的时候,需要同时移动left,right,i4.这里的去重,我们是当遇到相同的元素跳过它*/vector<vector<int> >ans;vector<int>v;sort(nums.begin(),nums.end());for(int i = 0; i < nums.size(); i++) {if(nums[i] > 0){//如果首元素大于0的话那么就不会有和为0了return ans;}if(i > 0 && nums[i] == nums[i-1]){continue;}int left = i+1;int right = nums.size() - 1;while(left < right) {int sum = nums[i] + nums[left] + nums[right];if(sum > 0) right--;else if(sum < 0) left++;else {v.push_back(nums[i]);v.push_back(nums[left]);v.push_back(nums[right]);ans.push_back(v);//去重处理(相邻的元素出现了重复)while(left < right && nums[right-1] == nums[right]) right--;while(left < right && nums[left+1] == nums[left]) left++;//换下一组答案(上方的去重处理只是指针移动到最后一个重复的元素)right--;left++;v.clear();}       }}return ans;}
};

142. 环形链表 II

class Solution {
public:ListNode *detectCycle(ListNode *head) {/**思路:1.定义快慢指针(快指针一次移动一个节点,慢指针一次移动两个结点)2.如果有环的话那么的话快慢指针一定会相遇(因为如果没环的话快慢指针永远不相遇)3.那么我们接下来就要确认出口在哪里,(根据以证明的结论,定义一个新的结点头指针指向它,然后快指针和其一块移动,当其相遇的时候,就是出口.**/ListNode* slowNode = head;ListNode* fastNode = head; //当fastNode->next != NULL的时候  是允许fastNode->next->next 为空的//如果没有此条件的话,那么当指针指向最后一个结点的时候,fast->next 已经为空了,它便不能再指向空了//即fast->next->next (不能空指向空)while(fastNode != NULL && fastNode->next != NULL) {fastNode = fastNode->next->next;slowNode = slowNode->next;if(slowNode == fastNode){ListNode* temp1 = fastNode;ListNode* temp2 = head;while( temp1 != temp2) {temp1 = temp1->next;temp2 = temp2->next;}return temp1;}   }return NULL;}
};

面试题 02.07. 链表相交

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {/**思路:1.双指针(一个指针指向长链表,一个指针指向短链表)2.我们需要将两个链表右对齐3.将其右对齐的目的是为了让长链表的指针移动到和短链表指针相同的位置这样就可以方便找到相同的指针(只要指针相同那么其接下来的数也相同)4.所以我们需要确定出长链表是谁  */ListNode* node1 = headA;//新定义一个结点方便操作,保存头结点 ListNode* node2 = headB;int lenA = 0;int lenB = 0;while(node1 != NULL) {node1 = node1->next;lenA++;}while(node2 != NULL) {node2 = node2->next;lenB++;} node1 = headA;//上方已经将node1和node2移到最后了node2 = headB;//因为我们需要将长链表的指针进行移动  所以我们需要确定出长链表if(lenB > lenA){swap(lenA,lenB);swap(node1,node2);}int poor = lenA - lenB; //长链表比短链表多的长度while(poor--) {node1 = node1->next;} while(node1 != NULL) {if(node1 == node2) {return node1;}node1 = node1->next;node2 = node2->next;} return NULL;}   
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全逐渐成为程序员的必备技能

大家好&#xff0c;我是Z哥。不知道大家有没有发现。如今&#xff0c;曝光某些知名公司信息泄露的事件频率越来越高。与之对应的&#xff0c;网络安全问题也越来越受到重视。从百度指数摘录了两张图给大家分享下。可以看到&#xff0c;对网络安全相关的信息和关注度在逐渐走高&…

webpack入门核心知识还看不过瘾?速来围观万字入门进阶知识

一文了解webpack入门进阶知识&#x1f93e;‍♀️序言&#x1f3d3;一、Tree Shaking1. 引例阐述2. Tree Shaking配置&#x1f3f8;二、Development和Prodiction模式的区分打包1. 项目打包结构2. 共有配置webpack.common.js3. 开发环境webpack.dev.js4. 生产环境webpack.prod.j…

Power Automate生产现场实例分享回顾

Power Automate生产现场实例分享回顾8月28日&#xff08;周五&#xff09;19&#xff1a;30-21&#xff1a;00&#xff0c;Danfos智慧工厂数字化解决方案高级顾问Helena Wang通过Teams和B站为大家分享了Power Platform开发以及它在工业生产当中的应用。一、什么是低代码开发&am…

万字总结webpack实战案例配置

一文了解webpack中常见实战案例配置&#x1f6f4;序言&#x1f68c;一、Library的打包1. webpack打包库2. 库引用冲突&#x1f68d;二、PWA的打包配置1. PWA是什么2. webpack中的PWA&#x1f68e;三、TypeScript的打包配置1. 引例阐述2. webpack对ts的配置&#xff08;1&#x…

程序员过关斩将--应对高并发系统有没有通用的解决方案呢?

“灵魂拷问&#xff1a;应对高并发系统有没有一些通用的解决方案呢&#xff1f;这些方案解决了什么问题呢&#xff1f;这些方案有那些优势和劣势呢&#xff1f;对性能孜孜不倦的追求是互联网技术不断发展的根本驱动力&#xff0c;从最初的大型机到现在的微型机&#xff0c;在本…

org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the

一:报错 org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement com.wyj.Dao.Bill.BillMapper.getBill. Its likely that neither a Result Type nor a Result Map was specified.二:解决 未在mapper.xml…

.NET5.0 单文件发布打包操作深度剖析

.NET5.0 单文件发布打包操作深度剖析前言随着 .NET5.0 Preview 8 的发布&#xff0c;许多新功能正在被社区成员一一探索&#xff1b;这其中就包含了“单文件发布”这个炫酷的功能&#xff0c;实际上&#xff0c;这也是社区一直以来的呼声&#xff0c;从 WinForm 的 msi 开始&am…

webpack实战之手写一个loader和plugin

webpack实战之编写一个简易的loader和plugin&#x1f514;序言&#x1f3b5;一、如何编写一个Loader1. 碎碎念2. 项目结构3. 业务代码编写&#xff08;1&#xff09;入口文件代码&#xff08;2&#xff09;编写loader&#xff08;3&#xff09;引用loader&#xff08;4&#xf…

手写一个简易bundler打包工具带你了解Webpack原理

用原生js手写一个简易的打包工具bundler&#x1f95d;序言&#x1f349;一、模块分析(入口文件代码分析)1. 项目结构2. 安装第三方依赖3. 业务代码4. 开始打包&#x1f951;二、依赖图谱Dependencies Graph1. 结果分析2. 分析所有模块的依赖关系&#x1f350;三、生成代码1. 逻…

不喜欢 merge 分叉,那就用 rebase 吧

阅读本文大概需要 3 分钟。有些人不喜欢 merge&#xff0c;因为在 merge 之后&#xff0c;commit 历史就会出现分叉&#xff0c;这种分叉再汇合的结构会让有些人觉得混乱而难以管理。如果你不希望 commit 历史出现分叉&#xff0c;可以用 rebase 来代替 merge。rebase &#xf…

你可能对position和z-index有一些误解

一文详解css中的position和z-index&#x1f9c3;序言&#x1f377;一、文章结构抢先知&#x1f378;二、position1. position的取值2. 标准文档流3. 各取值解析&#xff08;1&#xff09;static&#xff08;2&#xff09;relative&#xff08;3&#xff09;absolute&#xff08…

数据结构与算法专题——第九题 外排序

说到排序&#xff0c;大家第一反应基本上是内排序&#xff0c;是的&#xff0c;算法嘛&#xff0c;玩的就是内存&#xff0c;然而内存是有限制的&#xff0c;总有装不下的那一天&#xff0c;此时就可以来玩玩外排序&#xff0c;当然在我看来&#xff0c;外排序考验的是一个程序…

谁动了我的选择器?深入理解CSS选择器优先级

深入理解CSS选择器优先级&#x1f60f;序言&#x1f9d0;文章内容抢先看&#x1f910;一、基础知识1、为什么CSS选择器很强2、CSS选择器的一些基本概念&#xff08;1&#xff09;4种基本概念Ⅰ. 选择器Ⅱ. 选择符Ⅲ. 伪类Ⅳ. 伪元素&#xff08;2&#xff09;CSS选择器的命名空…

leetcode239. 滑动窗口最大值(思路+详解)

一&#xff1a;题目 二:思路 1.这个题不能用优先队列&#xff0c;虽然我们可以通过优先队列得到最大值&#xff0c;但是我们在移动 窗口的时候,便不可以正常的删除元素了 2.虽然不能用优先对列&#xff0c;但是我们依然希望可以得到队首的元素的时候是最大值&#xff0c;同时还…

《ASP.NET Core 与 RESTful API 开发实战》-- (第10章)-- 读书笔记

第 10 章 部署10.1 部署到 IISASP.NET Core 应用程序支持部署到 IIS 中&#xff0c;之后它将作为应用程序的反向代理服务器和负载均衡器&#xff0c;向应用程序中转传入的 HTTP 请求默认情况下&#xff0c;ASP.NET Core 项目的 Program 类使用如下方式创建 WebHostpublic stati…

翠香猕猴桃 和 薄皮核桃,快来下单

猴桃品种有很多&#xff0c;但不是所有的果子都叫翠香。椭圆形&#xff0c;果喙端较尖&#xff0c;黄褐色硬短茸毛&#xff1b;果肉翠绿色&#xff0c;质细多汁&#xff0c;香甜爽口&#xff0c;有芳香味&#xff0c;白色果心。这就是“翠香”&#xff0c;是集酸甜香于一身的猕…

你可能没有听说过 js中的 DOM操作还有这个: HTMLCollection 和 NodeList

一文了解DOM操作中的HTMLCollection和NodeList⛱️序言&#x1f388;一、基础知识1. 定义&#xff08;1&#xff09;HTMLCollection&#xff08;2&#xff09;NodeList2. 属性和方法&#xff08;1&#xff09;HTMLCollection&#xff08;2&#xff09;NodeList&#x1fa81;二、…

leetcode144. 二叉树的前序遍历(递归+迭代)

一:题目 二&#xff1a;上码 1&#xff1a;递归 class Solution { public:void preorder(TreeNode* root,vector<int>&v ) {if(root NULL) return;v.push_back(root->val);preorder(root->left,v);preorder(root->right,v);}vector<int> preorderT…

都说性能调优难?玩转这3款工具,让你秒变“老司机”!

鲁迅说过&#xff1a;菜鸟写业务&#xff0c;老鸟搭架构&#xff0c;高手玩调优。性能调优可谓是食物链顶端的技术&#xff0c;高薪面试必备良品。然而有不少的开发者&#xff0c;工作多年&#xff0c;却对性能调优几乎一无所知&#xff0c;今天就带大家掰扯掰扯&#xff0c;从…

一文梳理JavaScript中常见的七大继承方案

阐述JavaScript中常见的七大继承方案&#x1f4d6;序言&#x1f4d4;文章内容抢先看&#x1f4dd;一、基础知识预备1. 继承的定义2. 继承的方式&#x1f4da;二、6大常见继承方式1. 原型链继承 &#x1f4a1;&#xff08;1&#xff09;构造函数、原型和实例的关系&#xff08;2…