LeetCode算法——双指针篇

news2025/2/26 6:05:03

宫侑的发球最终进化为三刀流,那么我的题解也未必要循规蹈矩!


1、验证回文串

题目描述:

解法:

        这题官方给的关于双指针的题解都用到了多个库函数,如 tolower(大写字母转小写)、isalnum(判断一个字符是否是 字母 或者 十进制数字 )

        我想避免使用库函数,所有就不用双指针的做法了,而是使用

        思路很简单:

                1、先将字符串中所有字母统一为小写字母

                2、将数字和小写字母入栈,同时将完整的、连续的字符都加入到一个新字符串newS中

                3、再使用一个新字符串stkPop接收栈每一次pop出的字符

                4、比较 newS 和 stkPop 是否相等

        这道题的描述中提到了“字母和数字都属于字母数字字符”,但示例中没有给出串中包含数字的情况,导致测试用例 '0P' 没有通过,这也是因为我忽略了串中还有数字的情况

        要点:

                1、对于大写字母,在 ASCII 码的基础上 +32 就能转为小写字母

                2、栈从top位置开始pop,每次pop后栈中的元素会被删除

class Solution {
public:
    bool isPalindrome(string s) {
        
        stack <char> stk;
        string newS;
        string stkPop;  // 接收栈中所有字符pop后的结果

        if(s.size() <= 1) return true;
        for(int i = 0; i < s.size(); ++i){
            if(s[i] >= 'A' && s[i] <= 'Z'){
                s[i] += 32;  // 先将串中所有大写字母转为小写
            }

            // 只将串中的字母和数字入栈
            if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= '0' && s[i] <= '9')){
                stk.push(s[i]); 
                newS += s[i];
            }
        }
        while(!stk.empty()){
            stkPop += stk.top();
            stk.pop();
        }
        return stkPop == newS;
    }
};

2、判断子序列

题目描述:

解法:

        看到这种题,第一反应就是2个 for 循环,这种想法很不好

    思路:       

        为串 s 的首字符设置一个指针,同理为串 t 的首字符也设置一个指针

        我们是要在 t 中找出和 s 可以匹配上的子串,当两个串中匹配上了同一个字符时,两个指针都向后走一步,以便进行下一个字符的匹配

        若 s 的第2个字符与 t 的第2个字符没有匹配上,此时指向 s 的指针不动,指向 t 的指针继续向后移动,直到找到匹配项

        当 s 的指针走完整个 s 串时,表示在 t 中有可以匹配上的子序列,而 s 的指针没有走完 s 串时,则没有匹配成功

class Solution {
public:
    bool isSubsequence(string s, string t) {
        
        // 指向字符串s、t首字符的指针
        int i = 0, j = 0;
        if(s.size() == 0) return true;

        for(i, j; j < t.size(); ++j){
            if(s[i] == t[j]){
                i++;  // 匹配上了, i 和 j同走,没匹配上,只有 j 往后走
                if(i == s.size()) return true;
            }
        }
        return false;
    }
};

3、两数之和Ⅱ-输入有序数组

题目描述:

解法:

        被题目描述中的“给你一个下标从1开始的整数数组”迷惑了,一开始设定的指针是

int i = 1;

int j = numbers.size();

        哈哈哈哈果然溢出了,不论何种描述,数组容器的下标在计算机世界里永远是从0开始的

        最终根据题目要求返回 {i + 1, j + 1} 就好了

        之前只知道python中单个函数可以返回多个值,还在想C++怎么返回两个下标值呢?刚开始甚至还定义了另一个 vector<int> res 来接收下标,最终看了题解后发现了 return  {i + 1, j + 1} 这种写法

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {

        int i = 0;  // 首指针
        int j = numbers.size() - 1;  // 尾指针

        for(i, j; i < numbers.size(), j >= 0;){
            if((numbers[i] + numbers[j]) > target){
                j--;  // 两数之和大于目标,尾指针向前走
            }
            else if((numbers[i] + numbers[j]) < target){
                i++;
            }
            else{
                if((numbers[i] + numbers[j]) == target) return {i + 1, j + 1};
            }
        }
        return {-1, -1};
    }
};

4、盛水最多的容器

题目描述:

        官方写的垂线、端点之类的术语属实费脑子,推荐大家去看K神的题解——(传送门)

解法:

        实际上求解的正是矩形面积,规定好  i < j 后,唯一要做的就是判断 i 和 j 代表的槽板哪个高哪个低,因为较小的一方才能盛水而不漏

        每次移动槽板较低的一方(此处可能用到了贪心的思想),通过不断比较原来面积和新面积的大小来返回最终的最大面积。

class Solution {
public:
    int maxArea(vector<int>& height) {
        
        int res = 0;
        int i = 0;
        int j = height.size() - 1;

        while(i < j){

            // 指针指向的水槽板高度分别为 h[i], h[j],两者中小的一方决定容纳面积
            res = max(res, (min(height[i], height[j]) * (j - i)));
            if(height[i] < height[j]) i++;
            
            else j--;
        }
        return res;
    }
};

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

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

相关文章

Linux网络 基础概念

目录 背景知识 互联网的发展 局域网和广域网 网络协议栈 协议的概念 网络协议的分层 网络与操作系统的联系 网络传输的基本流程 IP地址和MAC地址 以太网通信 数据包的封装和分用 跨网段传输 背景知识 互联网的发展 计算机网络是计算机技术和通信技术相结合的产物…

蓝桥杯省赛冲刺(3)广度优先搜索

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种在图或树等非线性数据结构中遍历节点的算法&#xff0c;它从起始节点开始&#xff0c;按层级逐步向外扩展&#xff0c;即先访问离起始节点最近的节点&#xff0c;再访问这些节点的邻居&#xff0c;然后是邻…

每日学习笔记:C++ STL算法之比较容器

本文的API 是否相等(值与排序) equal()equal(....,op) 是否相等(值)【忽略排序】 is_permutation()is_permutation(....,op) 查找两个容器内容中第一处不同的元素位置 mismatch()mismatch(....,op) 是否小于 lexicographical_compare()lexicographical_compare(....,op) 是否升…

pytest【1】

文章目录 pytest测试用例示例测试用例批量执行1、terminal执行pytest2、main代码启动 测试结果fixtures&#xff08;夹具&#xff09;创建fixtures使用fixturesfixtures共享范围 POM&#xff1a;对元素的封装复用 pytest 单selenuim的问题&#xff1a; 代码重用性元素加载延迟…

第十五届蓝桥杯测试组模拟赛两期

文章目录 功能测试一期-场景法-登录功能一期-等价类-边界值-添加用户账号输入框一期-登录-缺陷报告一期- UI自动化测试一期-单元测试-路径覆盖二期-正交法-搜索条件组合二期-测试用例二期-缺陷报告二期-自动化测试二期-单元测试-基本路径覆盖 功能测试 一期-场景法-登录功能 …

DWC-60B冲击试样低温槽

一、概述 DWC—60B型冲击试验低温槽是本公司根据GB229-2020《金属夏比缺口冲击试验方法》中对低温装置的要求而最新研制开发的压缩机制冷设备。本设备采用进口 双压缩机制冷技术&#xff0c;采用热平衡原理及循环搅拌方式&#xff0c;达到对试样的自动均匀冷却、恒温&#xff0…

4-云原生监控体系-Grafana-基本使用

1. 介绍 使用Grafana&#xff0c;您可以通过漂亮、灵活的仪表板创建、探索和共享所有数据。查询、可视化、提醒和理解您的数据&#xff0c;无论数据存储在何处。 图片出处&#xff1a; https://grafana.com/grafana/ 官方网站 2. 界面介绍 Connections 可以配置数据源&#x…

软件行业之选:CRM系统如何赋能业务增长?

“CRM系统从整合营销渠道、自动化营销流程、强化客户全周期管理、增强服务能力、完善企业内部流程、开展数字化决策六个方面赋能软件行业。” 软件行业由于存在较高的技术壁垒&#xff0c;很多时候销售与客户沟通不顺畅&#xff0c;实施与客户沟通有难度&#xff0c;售后服务周…

国税发票查验接口、电子增值税发票查验接口、数电票查验接口

翔云发票查验接口支持增值税发票管理系统开具发票的真伪&#xff0c;通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验&#xff0c;支持返回全票面信息&#xff0c;API接口便于集成&#xff0c;可适用于多种应用场景。 发票查验接口python调用示例&#xff1a;…

D. Yet Another Palindrome Problem另一个回文问题

**思路:**直接找俩一样的数字看看他们中间是否存在大于等于1个数的情况 #include<iostream> #include<algorithm> #include<map> using namespace std; long long T,n,sum; int arr[6005]; map<int, int>mm; int main() {cin >> T;while (T--){…

vue实现海康h5player问题汇总

1. 引入问题 最开始写的时候&#xff0c;把h5player封装成了一个组件&#xff0c;把资源文件随便放在了一个目录下&#xff0c; 直接在子组件中引入&#xff0c;报错window.JSPlugin is not a constructor 或者JSPlugin is not defined 初步分析应该是引入资源文件失败&#x…

[Linux 进程控制(一)] 进程等待

文章目录 1、进程等待1.1 为什么要进程等待1.2 进程等待必要性1.3 进程等待的方法1.3.1 wait方法1.3.2 waitpid方法 1.4 获取子进程的status1.5 waitpid的第三个参数options 1、进程等待 1.1 为什么要进程等待 解决子进程僵尸问题带来的内存泄漏问题。子进程将父进程交给的任…

【上海大学计算机组成原理实验报告】三、微指令系统实验

一、实验目的 了解译码器、微指令结构的基本工作原理。学习设计微指令的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;本实验所用的实验箱的微指令系统控制总线宽度为24位&#xff0c;每个地址单元宽度也为24位&#xff0c;其中微指令存储器由3片8位存储器按照…

如何在SFTP工具中使用固定公网地址远程访问内网Termux系统

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

期货开户市场是没硝烟的战场

另外&#xff0c;期货市场是没有硝烟的战场&#xff0c;《孙子兵法》、《吴子兵法》、《战略论》等兵法你最好也找来读一读。《金刚经》、《坛经》、《心经》、《道德经》等你最好也认真地学一学。我认为&#xff0c;从来没有哪个领域像金融交易领域这样充斥这么多的荒谬理论&a…

Python的基础知识学习路线2—运算符与变量类型(使用jupyter notebook进行操作:最全路线,每部分附有代码操作结果)

一、更改jupyter notebook 打开文件的位置 1、打开Anaconda Prompt终端&#xff0c;输入以下命令&#xff0c;创建配置文件&#xff1a;jupyter_notebook_config.py jupyter notebook --generate-config2、打开生成的配置文件 3、编辑配置文件jupyter_notebook_config.py&…

共享IP和独享IP如何选择,两者有何区别?

有跨境用户在选择共享IP和独享IP时会有疑问&#xff0c;不知道该如何进行选择&#xff0c;共享IP和独享IP各有其特点和应用场景&#xff0c;选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较&#xff1a; 首先两者的主要区别在于使用方式和安全性&#xff1a;共…

蓝桥杯2023年第十四届省赛真题-冶炼金属

题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#xff0c;无法继…

【C语言】C语言题库【附源码+持续更新】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 目录 1、练习2-1 Programming in C is fun! 2、练习2-3 输出倒三角图案 3、练习2-4 温度转换 4、练习2-6 计算物体自由下落的距离 5、练习2-8 计算摄氏温度 6、练习2-9 整数四则运算 7、练习2-10 计算分段函数[1…

深度学习500问——Chapter07:生成对抗网络(GAN)(1)

文章目录 7.1 GAN基本概念 7.1.1 如何通俗理解GAN 7.1.2 GAN的形式化表示 7.1.3 GAN的目标函数是什么 7.1.4 GAN的目标函数和交叉熵有什么区别 7.1.5 GAN的Loss为什么降不下去 7.1.6 生成式模型、判别式模型的区别 7.1.7 什么是mode collapsing 7.1.8 如何解决mode collapsing …