C++数据结构与算法——双指针法

C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!

文章目录

  • 一、移除元素(力扣27)
  • 二、反转字符串(力扣344)
  • 三、替换数字(卡码网 54)
  • 四、翻转字符串里的单词(力扣151)
  • 五、反转链表(力扣206)
  • 六、删除链表的倒数第 N 个结点(力扣19)
  • 七、链表相交(力扣面试题 02.07)
  • 八、环形链表 II(力扣142)
  • 九、三数之和(力扣15)
  • 十、四数之和(力扣18)

一、移除元素(力扣27)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

class Solution {
public:int removeElement(vector<int>& nums, int val) {// 利用快慢指针进行删除// 1. 判断是否只有零个或一个元素,防止索引超出数组长度if(nums.size()==1){if(nums[0]==val){return 0;}else{return 1;}}if (nums.size()==0){return 0;}int slow =0;for(int fast=0;fast<nums.size();fast++){if(nums[fast]!=val){nums[slow] = nums[fast];slow++;}}return slow;}
};

在这里插入图片描述

二、反转字符串(力扣344)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
提示:
1 <= s.length <= 105
s[i] 都是 ASCII 码表中的可打印字符

class Solution {
public:void reverseString(vector<char>& s) {// 双指针解决int begin =0;int end = s.size()-1;while(begin<end){// 交换char temp = s[begin];s[begin] = s[end];s[end] = temp;begin++;end--;}}
};

在这里插入图片描述

三、替换数字(卡码网 54)

题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
提示信息
数据范围:
1 <= s.length < 10000。

#include <iostream>
using namespace std;int main() {string inputS;cin >> inputS;int count = 0;// 遍历原来数组,记录其中数字的个数for (int i = 0; i < inputS.length(); i++) {if (inputS[i] <= '9' && inputS[i]>='0') {count++;}}int FLength = inputS.length();// resize 原来的字符串inputS.resize(FLength + count * 5);// 替换原来字符串中的字符,从后向前替换int j = inputS.length()-1;for (int i = FLength - 1; j>i; i--,j--) {if (inputS[i] <= '9' && inputS[i]>='0') {// 是数字要替换inputS[j] = 'r';inputS[j-1] = 'e';inputS[j-2] = 'b';inputS[j-3] = 'm';inputS[j-4] = 'u';inputS[j-5] = 'n';j -= 5;}else {inputS[j] = inputS[i];}}cout << inputS << endl;system("pause");return 0;}

在这里插入图片描述

四、翻转字符串里的单词(力扣151)

给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

class Solution {
public:string reverseWords(string s) {// 去除空格removeSpace(s);// // 翻转整个句子reverse(s.begin(), s.end());// 翻转每个单词// 首先找到每个单词的位置int slow=0;for(int fast=0;fast<s.length();fast++){if(s[fast+1]==' ' || fast==s.length()-1){reverseWord(s,slow,fast);slow = fast+2;}}return s;}// 翻转每个单词void reverseWord(string& s, int begin, int end) {while (begin < end) {swap(s[begin], s[end]);begin++;end--;}}// 去除字符串中多余的空格void removeSpace(string& s) {// 快慢指针去除空格int slow = 0;for (int fast = 0; fast < s.length(); fast++) {if (s[fast] != ' ') {// 不为空格才进行下面的操作// 添加每个单词之间的空格,句子开头不加if (slow != 0) {s[slow] = ' ';slow++;}while (fast<s.size() && s[fast] != ' ') {s[slow] = s[fast];slow++;fast++;}}}s.resize(slow);}};

在这里插入图片描述

五、反转链表(力扣206)

这里是引用

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if(head==NULL||head->next==NULL){// 只有一个结点return head;}// 定义两个指针,一个指前面的,一指后面的ListNode *pre = NULL;ListNode *cur = head;while(cur!=NULL){// 用一个值去接收curListNode *temp = cur->next;cur->next = pre;pre = cur;cur = temp;}return pre;}};

在这里插入图片描述

六、删除链表的倒数第 N 个结点(力扣19)

这里是引用

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {if (head==NULL){return head;}ListNode * dummyNode = new ListNode(0);dummyNode->next = head;// 使用快慢指针ListNode* fast = dummyNode;ListNode* slow = dummyNode;while(n--){// 快指针先走n个fast = fast->next;}while(fast!=NULL&&fast->next!=NULL){fast = fast->next;slow = slow->next;}// 删除元素ListNode * temp = slow->next;slow->next = slow->next->next;delete temp; // 删除return dummyNode->next;}
};

在这里插入图片描述

七、链表相交(力扣面试题 02.07)

在这里插入图片描述

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 实际上是找相等的结点,不是值相等,而是 是同一个结点// 将两个链表右对齐// 求两个链表的长度if(headA==NULL||headB==NULL){return NULL;}int lenA =1;int lenB =1;ListNode * curA = headA;ListNode * curB = headB;while(curA->next!=NULL){lenA++;curA = curA->next;}while(curB->next!=NULL){lenB++;curB = curB->next;}// 找最短的链表int minLen =min(lenA,lenB);// AB需要移动的长度int needA= lenA-minLen;int needB = lenB - minLen;// 右对齐两个节点while(needA--){headA = headA->next;}while(needB--){headB = headB->next;}// 比较之后的链表是否相同while(headA!=NULL||headB!=NULL){if(headA== headB){return headA;}else{headA = headA->next;headB = headB ->next;}}return NULL;}
};

在这里插入图片描述

八、环形链表 II(力扣142)

在这里插入图片描述

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode * first = head;ListNode * slow = head;while(first!=NULL&&first->next!=NULL){first = first->next->next;slow = slow->next;if(first==slow){// 此时相遇ListNode * index1 = first;ListNode * index2 = head;// 找入环口while(index1!=index2){index1 = index1->next;index2 = index2->next;}return index1;}}return NULL;}
};

在这里插入图片描述

九、三数之和(力扣15)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {// 先对数组排序sort(nums.begin(),nums.end());// 定义结果数组vector<vector<int>> result;// 剪枝操作if(nums[0]>0){return {}; // 第一个元素都大于0了,说明不可能加起来等于0,直接返回空}for(int i=0;i<nums.size();i++){// 定义两个指针int begin = i+1;int end = nums.size()-1;// 去重操作if(i>0&&nums[i]==nums[i-1]){// 当前的i和i-1的元素是一样的continue; // 跳过当前循环}while(begin<end){if((nums[i]+nums[begin]+nums[end])==0){result.push_back({nums[i],nums[begin],nums[end]});while(begin<end&&nums[begin]==nums[begin+1]){begin++;}while(begin<end&&nums[end]==nums[end-1]){end--;}begin++;end--;}else if((nums[i]+nums[begin]+nums[end])>0){end--;}else{begin++;}}}return result;}
};

在这里插入图片描述

十、四数之和(力扣18)

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
提示:
1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 先排序sort(nums.begin(),nums.end());// 定义最终返回数组vector<vector<int>> result;// 类似于三数之和,多了一层循环for (int i=0;i<nums.size();i++){// 剪枝if(nums[0]>=0&&nums[0]>target){break;}// 去重if(i>0&&nums[i]==nums[i-1]){continue;}for(int j=i+1;j<nums.size();j++){// 剪枝if(nums[i]+nums[j]>target&&nums[j]>=0){break;}// 去重if(j>i+1&&nums[j]==nums[j-1]){continue;}// 类似于三数之和int begin = j+1;int end = nums.size()-1;while(begin<end){if((long) nums[i]+nums[j]+nums[begin]+nums[end]==target){// 找到符合要求的数组,记录result.push_back({nums[i],nums[j],nums[begin],nums[end]});while(begin<end&&nums[begin]==nums[begin+1]){begin++;}while(begin<end&&nums[end]==nums[end-1]){end--;}begin++;end--;}else if((long)nums[i]+nums[j]+nums[begin]+nums[end]>target){end--;}else{begin++;}}}}return result;}
};

在这里插入图片描述

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

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

相关文章

NLP_ChatGPT的RLHF实战

文章目录 介绍小结 介绍 ChatGPT 之所以成为ChatGPT&#xff0c;基于人类反馈的强化学习是其中重要的一环。而ChatGPT 的训练工程称得上是复杂而又神秘的&#xff0c;迄今为止&#xff0c;OpenAl也没有开源它的训练及调优的细节。 从 OpenAl已经公开的一部分信息推知&#xff…

计算机组成原理(2)-----存储芯片与CPU的连接

目录 一.单块存储芯片与CPU的连接 二.多块存储芯片与CPU的连接 1.位扩展 2.字扩展 &#xff08;1&#xff09;线选法 &#xff08;2&#xff09;译码器片选法 3.字位同时扩展 三.译码器相关 一.单块存储芯片与CPU的连接 如图所示是8*8位的芯片&#xff0c;总共8个存储…

OS设备管理

设备管理 操作系统作为系统资源的管理者&#xff0c;其提供的功能有&#xff1a;处理机管理、存储器管理、文件管理、设备管理。其中前三个管理都是在计算机的主机内部管理其相对应的硬件。 I/O设备 I/O即输入/输出。I/O设备即可以将数据输入到计算机&#xff0c;或者可以接收…

高校危化试剂管理:Java与SpringBoot的革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Vue核心基础6:Vue内置指令、自定义指令、生命周期

1 Vue中的内置指令 <script>const vm new Vue({el: #root,data: {n: 1,m: 100,name: Vue,str: <h3>你好</h3>}})</script> 1.1 v-text <div v-text"name"></div>1.2 v-html <div v-html"str"></div> …

最小生成树(Kruskal算法及相关例题)

1.Kruskal算法概念以及基本思路 &#xff08;1&#xff09;概念&#xff1a; 克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。它的时间复杂度为O&#xff08;ElogE&#xff09;(E是图G的边的总数)&#xff0c;适合于求边稀疏的网的最小生成树 。 其基本思想是&#xff…

黄金交易策略(Nerve Nnife.mql4):做单手数设计

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 NK的做单量是由参数设定的&#xff0c;以下分别是参数项&#xff1a; 考虑到复利的情况&#xff0c;若10000本金&#xff0c;在以上三个参数的设计下&#xff0c;第1单的购买量是0.01*10,第2单是0.01*10*2…

Java迭代器详解,看这一篇就够了

文章目录 &#x1f6a9;Java 迭代器详解 &#x1f4da;迭代器的定义 &#x1f4d2;认识Iterator ✏️类结构图 ✒️Iterable接口 &#x1f58d;️Iterator接口 &#x1f4c3;Iterator接口的方法 &#x1f4d9;迭代器的使用 &#x1f3f7;️使用迭代器遍历集合 &#x1f516;Ite…

[BIZ] - 1.金融交易系统特点

1. 典型数据汇总 数据 说明 新增数据量(条/天) Qps(条/s) 消息大小(Byte) 实时性 可丢失性 可恢复性 实时行情 1.使用场景&#xff1a;交易&#xff0c;报价&#xff0c;策略验证&#xff1b; 2.冷热分离&#xff1a;彭博行情/其他行情&#xff1b;黄金&期货行情/…

Java图形化界面编程——AWT概论 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件&#xff0c;但不能独立存在&#xff0c;它必须内嵌其他容器中使用&#xff0c;默认使用FlowLayout管理其内部组件布局&#xff1b;S…

交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…

MySQL学习Day15——MySQL安装与使用

一、Linux下的MySQL的安装与使用: 卸载MySQL: 1.关闭当前MySQL服务:systemctl stop mysql.service 2.查看当前mysql安装状况:rpm -qa | grep -i mysql 3.卸载上述命令查询出的已安装的程序:yum remove mysql-xxx mysql-xxx mysql-xxxx 4.删除mysql相关文件: (1)查找相关文…

解决vscode报错,在赋值前使用了变量“XXX“

问题&#xff1a;如图所示 解决方法&#xff1a; 法一&#xff1a; 补全函数使其完整 法二&#xff1a; 使用断言

c++Qt网络操作

1、基础概念 1.1 TCP/UDP TCP 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适用情况&#xff1a; 1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 2、适合于对传输质量要求较…

【STM32 CubeMX】串口编程DMA

文章目录 前言一、DMA方式1.1 DMA是什么1.2 CubeMX配置DMA1.3 DMA方式函数使用DMA的发送接收函数 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项至关重要的功能&#xff0c;它允许单片机与外部设备进行数据交换&#xff0c;如传感器、显示器或其他设备。然而&#xff0…

Linux笔记之xhost +和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解

Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解 ——2024-02-11 code review! 文章目录 Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解xhost 的作用xhost 与 Docker 的关系 -e GDK_SCALE 和 -e GDK_DPI_SCALE详解GDK_SCALEGDK_DPI_SC…

【Linux】进程的初步认识

进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程&#xff0c;首先我们要知道两点 我们可以同时启动多个程序&#xff0c;也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些…

036-安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

036-安全开发-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注入 #知识点&#xff1a; 1、JavaEE-组件安全-Log4j 2、JavaEE-组件安全-Fastjson 3、JavaEE-基本了解-JNDI-API 演示案例&#xff1a; ➢Java-三方组件-Log4J&JNDI ➢Java-三方组件-Fa…

OpenAI全新发布文生视频模型Sora - 现实,不存在了

OpenAI&#xff0c;发他们的文生视频大模型&#xff0c;Sora了。。。。。 而且&#xff0c;是强到&#xff0c;能震惊我一万年的程度。。。 https://openai.com/sora 如果非要用三个词来总结Sora&#xff0c;那就是“60s超长长度”、“单视频多角度镜头”和“世界模型” &am…

Codeforces Round 926 (Div. 2)(A,B,C,D,E,F)

这场还是很有含金量的&#xff0c;B题开始就有难度了&#xff0c;B是个推结论的题&#xff0c;C要推结论然后递推&#xff0c;D题是有点难的树上DP&#xff08;主要是状态转移方程不好写&#xff09;&#xff0c;E题是个二进制预处理然后状压DP&#xff0c;F题是个数论&#xf…