刷题09 双指针


2540. 最小公共值

给你两个整数数组 nums1 和 nums2 ,它们已经按非降序排序,请你返回两个数组的 最小公共整数 。如果两个数组 nums1 和 nums2 没有公共整数,请你返回 -1 。

如果一个整数在两个数组中都 至少出现一次 ,那么这个整数是数组 nums1 和 nums2 公共 的。

输入:nums1 = [1,2,3], nums2 = [2,4]
输出:2
解释:两个数组的最小公共元素是 2 ,所以我们返回 2 。

        暴力循环会超时,用两个指针进行寻找下标。 

int getCommon(int* nums1, int nums1Size, int* nums2, int nums2Size) {int idx1=0,idx2=0;while(idx1<nums1Size&&idx2<nums2Size){if(nums1[idx1]==nums2[idx2]){return nums1[idx1];}else{if(nums1[idx1]<nums2[idx2]){idx1++;}else{idx2++;}}}return -1;
}


2562. 找出数组的串联值

给你一个下标从 0 开始的整数数组 nums 。现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。例如,15 和 49 的串联是 1549 。

nums 的 串联值 最初等于 0 。执行下述操作直到 nums 变为空:

如果 nums 中存在不止一个数字,分别选中 nums 中的第一个元素和最后一个元素,将二者串联得到的值加到 nums 的 串联值 上,然后从 nums 中删除第一个和最后一个元素。

如果仅存在一个元素,则将该元素的值加到 nums 的串联值上,然后删除这个元素。

输入:nums = [7,52,2,4]
输出:596
解释:在执行任一步操作前,nums 为 [7,52,2,4] ,串联值为 0 
long long findTheArrayConcVal(int* nums, int numsSize){int l=0,r=numsSize-1;long long ans=0;int pre,back;while(l<r){pre=nums[l++],back=nums[r--];while(back){pre*=10;back/=10;}ans+=pre+nums[r+1];}if(r==l) ans+=nums[l];return ans;
}


2824. 统计和小于目标的下标对数目

 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target ,请你返回满足 0 <= i < j < n 且 nums[i] + nums[j] < target 的下标对 (i, j) 的数目。

输入:nums = [-1,1,2,3,1], target = 2
输出:3

        暴力法:

int countPairs(int* nums, int numsSize, int target){int ans=0;for(int i=0;i<numsSize;++i){for(int j=i+1;j<numsSize;++j){if(nums[i]+nums[j]<target){ans++;}}}return ans;
}

        双指针法:

int cmp(int *a, int *b) {return *a - *b;
}
int countPairs(int* nums, int numsSize, int target){qsort(nums, numsSize, sizeof(int), cmp);int ans=0;int i=0,j=numsSize-1;while(i<j){if(nums[i]+nums[j]<target){ans+=j-i;i++;}else{j--;}}return ans;
}


443. 压缩字符串 

从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :

  • 如果这一组长度为 1 ,则将字符追加到 s 中。
  • 否则,需要向 s 追加字符,后跟这一组的长度。

压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。

请在 修改完输入数组后 ,返回该数组的新长度。

输入:chars = ["a","a","b","b","c","c","c"]
输出:返回 6 ,输入数组的前 6 个字符应该是:["a","2","b","2","c","3"]
解释:"aa" 被 "a2" 替代。"bb" 被 "b2" 替代。"ccc" 被 "c3" 替代。
int compress(char* chars, int charsSize){char* res=malloc(sizeof(char)*2000);int len=0;int l=0,r=0;while(r<charsSize){int count=0;while(r<charsSize&&chars[l]==chars[r]){r++;}chars[len++]=chars[l];count=r-l;if(count>1){char tmp[10];sprintf(tmp,"%d",count);for(int i=0;i<strlen(tmp);++i) {chars[len++]=tmp[i];}}l=r;}return len;
}

 
1679. K 和数对的最大数目

 给你一个整数数组 nums 和一个整数 k 每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。返回你可以对数组执行的最大操作数。

输入:nums = [1,2,3,4], k = 5
输出:2
解释:开始时 nums = [1,2,3,4]:
- 移出 1 和 4 ,之后 nums = [2,3]
- 移出 2 和 3 ,之后 nums = []
不再有和为 5 的数对,因此最多执行 2 次操作。
int cmp(int *a,int *b){return *a-*b;
}
int maxOperations(int* nums, int numsSize, int k){qsort(nums,numsSize,sizeof(int),cmp);int ans=0;int l=0,r=numsSize-1;while(l<r){int sum=nums[l]+nums[r];if(sum<k){l++;}else if(sum>k){r--;}else{ans++;l++;r--;}}return ans;
}

31. 下一个排列 

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。

类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。

而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

输入:nums = [1,2,3]
输出:[1,3,2]
void nextPermutation(int* nums, int numsSize) {int i=numsSize-2;//找到第一个非降序的iwhile(i>=0&&nums[i]>=nums[i+1]){i--;}if(i>=0){int j=numsSize-1;//找到大于nums[i]最大的数while(j>=0&&nums[i]>=nums[j]){j--;}//交换char tmp=nums[i];nums[i]=nums[j];nums[j]=tmp;}//将i后面的数反转int l=i+1,r=numsSize-1;while(l<r){char tmp=nums[l];nums[l]=nums[r];nums[r]=tmp;l++;r--;}
}


556. 下一个更大元素 III 

 给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。

注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,返回-1

输入:n = 12                 输入:n = 21
输出:21           ​​​​​​​          输出:-1
int nextGreaterElement(int n) {char nums[32];sprintf(nums,"%d",n);int i=strlen(nums)-2;//找第一个非递减的iwhile(i>=0&&nums[i]>=nums[i+1]){i--;}if(i<0) return -1;int j=strlen(nums)-1;//找到第一个大于nums[i]的jwhile(j>=0&&nums[i]>=nums[j]){j--;}//交换char tmp=nums[i];nums[i]=nums[j];nums[j]=tmp;//将i后面的数字反转int l=i+1,r=strlen(nums)-1;while(l<r){char tmp=nums[l];nums[l]=nums[r];nums[r]=tmp;l++;r--;}long long ans=atol(nums);if(ans>INT_MAX||ans<INT_MIN) return -1;return ans;
}

面试题 16.06. 最小差

给定两个整数数组ab,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差

输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}
输出:3,即数值对(11, 8)
int cmp(int* a, int* b) {return *a-*b;
}
int smallestDifference(int* a, int aSize, int* b, int bSize){if(a==NULL||aSize==0||b==NULL||bSize==0) {return 0;}qsort(a, aSize, sizeof(int), cmp);qsort(b, bSize, sizeof(int), cmp);int i=0,j=0;long ans=abs((long)(a[0]-b[0]));while(i<aSize&&j<bSize){if(a[i]!=b[j]){long cur=abs((long)a[i]-(long)b[j]);ans=fmin(ans,cur);if(a[i]>b[j]){j++;}else{i++;}}else{return 0;}}return ans;
}


80. 删除有序数组中的重复项 II 

 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。
int removeDuplicates(int* nums, int numsSize) {if(numsSize<=2) return numsSize;int slow=2,fast=2;while(fast<numsSize){if(nums[slow-2]!=nums[fast]){nums[slow]=nums[fast];slow++;}fast++;}return slow;
}


2161. 根据给定数字划分数组 

 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列,使得以下条件均成立:

  • 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。
  • 所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。
  • 小于 pivot 的元素之间和大于 pivot 的元素之间的 相对顺序 不发生改变。
输入:nums = [9,12,5,10,14,3,10], pivot = 10
输出:[9,5,3,10,10,12,14]
解释:
元素 9 ,5 和 3 小于 pivot ,所以它们在数组的最左边。
元素 12 和 14 大于 pivot ,所以它们在数组的最右边。
小于 pivot 的元素的相对位置和大于 pivot 的元素的相对位置分别为 [9, 5, 3] 和 [12, 14] ,它们在结果数组中的相对顺序需要保留。
int* pivotArray(int* nums, int numsSize, int pivot, int* returnSize) {int *res=malloc(sizeof(int)*numsSize);int l=0,r=numsSize-1;memset(res,0,numsSize*sizeof(int));for(int i=0;i<numsSize;++i){if(nums[i]<pivot){res[l++]=nums[i];}else if(nums[i]>pivot){res[r--]=nums[i];}}for(int i=l;i<=r;++i){res[i]=pivot;}int i=r+1,j=numsSize-1;while(i<j){char tmp=res[i];res[i]=res[j];res[j]=tmp;i++;j--;}*returnSize=numsSize;return res;
}


1750. 删除字符串两端相同字符后的最短长度 

选择字符串 s 一个 非空 的前缀,这个前缀的所有字符都相同。选择字符串 s 一个 非空 的后缀,这个后缀的所有字符都相同。前缀和后缀在字符串中任意位置都不能有交集。前缀和后缀包含的所有字符都要相同。同时删除前缀和后缀。

请你返回对字符串 s 执行上面操作任意次以后(可能 0 次),能得到的 最短长度 。

输入:s = "ca"
输出:2
解释:你没法删除任何一个字符,所以字符串长度仍然保持不变。
输入:s = "cabaabac"
输出:0
解释:最优操作序列为:
- 选择前缀 "c" 和后缀 "c" 并删除它们,得到 s = "abaaba" 。
- 选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "baab" 。
- 选择前缀 "b" 和后缀 "b" 并删除它们,得到 s = "aa" 。
- 选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "" 。
int minimumLength(char* s) {int n=strlen(s);int l=0,r=n-1;while(l<r&&s[l]==s[r]){char c=s[l];while(l<=r&&s[l]==c){l++;}while(l<=r&&s[r]==c){r--;}}return r-l+1;
}

 

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

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

相关文章

std::for_each

std::for_each 是 C STL 中的标准函数之一&#xff0c;用于对指定的容器或序列中的元素执行指定的操作。该函数的头文件为 <algorithm>&#xff0c;定义在 namespace std 中&#xff0c;因此需要包含该头文件才能使用该函数。 std::for_each 函数是 C STL 中自 C98 就开…

「优选算法刷题」:汉明距离

一、题目 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0)↑ …

【JavaSE篇】——类和对象

目录 &#x1f393;类定义和使用 &#x1f393;简单认识类 &#x1f6a9;类的定义格式 ❗注意事项 &#x1f393;类的实例化 &#x1f6a9;什么是实例化 &#x1f6a9;类和对象的说明 &#x1f393;this引用 &#x1f6a9;为什么要有this引用 &#x1f6a9;什么是thi…

【JavaScript 基础入门】02 JavaScrip 详细介绍

JavaScrip 详细介绍 目录 JavaScrip 详细介绍1. JavaScript 是什么2. JavaScript的作用3. HTML/CSS/JS 的关系4. 浏览器执行 JS 简介5. JavaScript 的组成6. JavaScript 的特点 1. JavaScript 是什么 JavaScript&#xff0c;通常缩写为 JS&#xff0c;是一种高级的&#xff0c;…

分布式技术浅见之复制

分布式技术浅见之复制 前言一、何为复制&#xff1f;1.1 主从复制和无主从复制1.2 同步复制与异步复制1.3 来点栗子1.3.1 Redis1.3.2 Mysql1.3.3 Mongo 二、复制是如何实现的&#xff1f;2.1 复制的过程2.2 来点栗子2.2.1 Redis2.2.2 Mysql2.2.3 Mongo 2.2 复制的实现方式2.4 举…

OpenHarmony—不支持解构赋值

规则&#xff1a;arkts-no-destruct-assignment 级别&#xff1a;错误 ArkTS不支持解构赋值。可使用其他替代方法&#xff0c;例如&#xff0c;使用临时变量。 TypeScript let [one, two] [1, 2]; // 此处需要分号 [one, two] [two, one];let head, tail [head, ...tail]…

MySQL十部曲之六:数据操作语句(DML)

文章目录 前言语法约定DELETEINSERTSELECT查询列表SELECT 选项子句FROMWHEREORDER BYGROUP BYHAVINGWINDOWLIMITFOR SELECT ... INTO连接查询CROSS JOIN和INNER JOINON和USINGOUTER JOINNATURE JOIN 子查询标量子查询使用子查询进行比较带有ANY、IN或SOME的子查询带有ALL的子查…

DETR解读,将Transformer带入CV

论文出处 [2005.12872] End-to-End Object Detection with Transformers (arxiv.org) 一个前置知识 匈牙利算法&#xff1a;来源于二部图匹配&#xff0c;计算最小或最大匹配 算法操作&#xff1a;在n*n的矩阵中 减去行列最小值&#xff0c;更新矩阵&#xff08;此时行或者…

搜维尔科技:【简报】元宇宙数字人赛道,优秀作品赏析《大福太郎》

这次采用亮眼的浅粉做为发色&#xff0c;为了贴合她小警察的身分 给了她一顶特制的警帽&#xff0c;上面有大福的荧光蓝叶片作为标 志&#xff0c;而在配件及裙子上也加入了许多科技元素的小巧思。 学校&#xff1a; 朝阳科技大学&#xff08;台湾&#xff09; 选手&#xff…

小周学JAVA—八股四

mybatis的优缺点 优点: 1.SQL写在XML里面&#xff0c;与业务代码分离&#xff0c;因此相对比较灵活&#xff0c;便于统一管理 2.spring集成很方便&#xff0c;由于使用的JDBC连接数据库&#xff0c;因此&#xff0c;不需要针对不同数据专门做兼容。 缺点: SQL的编写&#xff…

消息中间件之RocketMQ(二)

RocketMQ支持的消息类型 了解之前&#xff0c;首先要熟悉RocketMQ中的组件架构设计 1.顺序消息 将同一个订单(即具有相同的orderId)的消息按状态先后顺序消费的&#xff0c;所以消息生产者调用send方法发送时需要传入MessageQueueSelector接口的,实现类&#xff0c;将order…

【GitHub项目推荐--开源PDF 工具】【转载】

12 年历史的 PDF 工具开源了 最近在整理 PDF 的时候&#xff0c;有一些需求普通的 PDF 编辑器没办法满足&#xff0c;比如 PDF 批量合并、编辑等。 于是&#xff0c;我就去 GitHub 上看一看有没有现成的轮子&#xff0c;发现了这个 PDF 神器「PDF 补丁丁」&#xff0c;让人惊…

Vue+OpenLayers7入门到实战:快速搭建Vue+OpenLayers7地图脚手架项目。从零开始构建Vue项目并整合OpenLayers7.5.2

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。 本章会详细讲解从NodeJS环境到npm环境的各个步骤,再到使用vue-cli脚手架快速生成项目,以及添加OpenLayers7地图库依赖,编写简单的xyz高德地图显示…

VPP接口二层互联xconnect

以下命令将接口设置为L2二层互联模式&#xff0c;如果要双向流量&#xff0c;需要两个口都设置成此模式。一个接口上接收到的报文将发送到另外一个接口&#xff0c;反之亦然。 vpp# set interface state HundredGigabitEthernet65/0/0 up vpp# set interface state HundredGig…

【大厂AI课学习笔记】1.1.2 现阶段人工智能方法和技术领域

目录 1.2 现阶段人工智能方法和技术领域 1.2.1 从技术应用场景展开 计算机视觉 语音识别 自然语言处理 1.2.2 实现AI的技术工具 机器学习的主要类型&#xff1a; 深度学习的重要性&#xff1a; 1.2 现阶段人工智能方法和技术领域 1.2.1 从技术应用场景展开 计算机视觉…

RuoYi-Vue前后端分离后台开发框架运行详细教程

一、官网下载代码 RuoYi-Vue是一款基于SpringBootVue的前后端分离极速后台开发框架。 若依官网&#xff1a;http://ruoyi.vip演示地址&#xff1a;http://vue.ruoyi.vip代码下载&#xff1a;https://gitee.com/y_project/RuoYi-Vue 下载之后解压&#xff0c;ruoyi-ui是前端代…

opencv学习二值分析

内容来源于《opencv4应用开发入门、进阶与工程化实践》 二值分析&#xff1a; 常见的二值化方法&#xff1a; 基于全局阈值&#xff08;threshold&#xff09;得到的二值图像&#xff1b;基于自适应阈值&#xff08;adaptiveThreshold&#xff09;得到的二值图像&#xff1…

docker数据卷的使用

文章目录 1、数据卷产生背景2、数据卷的使用2.1、创建数据卷2.2、挂载数据卷2.3、共享数据卷2.4、删除数据卷2.5、备份和迁移数据卷 总结 1、数据卷产生背景 Docker的镜像是由一系列的只读层组合而来&#xff0c;当启动一个容器时&#xff0c;Docker加载镜像的所有只读层&…

JavaScript高级:构造函数

1 引言 构造函数是一种特殊的函数&#xff0c;主要用来初始化对象&#xff1b;常规的 {...} 语法允许创建一个对象&#xff0c;但是通过构造函数可以快速创建多个类似的对象 2 约定 1. 命名以大写字母开头&#xff1b; 2. 它们只能由 “new” 操作符来执行 <script>//…

【C++】filesystem

文章目录 1. 基本配置1.1. VS2019修改C标准1.2. filesystem的引入 2. 日常使用2.1. 认识2.2. 控制台输入路径并对路径进行基本操作 <filesystem>是C 17标准引入的标准库&#xff0c;主要用于处理文件系统的目录和文件操作&#xff0c;接下来总结该库的基本配置和日常使用…