剑指Offer(数据结构与算法面试题精讲)C++版——day7

剑指Offer(数据结构与算法面试题精讲)C++版——day7

      • 题目一:最多删除一个字符得到回文
      • 题目二:回文子字符串的个数
      • 题目三:删除倒数第k个节点

题目一:最多删除一个字符得到回文

在这里插入图片描述
    这里我们可以在经典的字符串回文判断方法基础上进行巧妙调整。判断字符串是否为回文,常用的高效方式是使用双指针法,让两个指针分别从字符串的头部和尾部开始,相向而行,朝着字符串的中间遍历。在这个遍历过程中,一旦发现两个指针所指向的字符不相等,就到了关键的决策点。此时,我们需要进行两种尝试操作,分别是删除当前左侧指针所指向的字符,以及删除当前右侧指针所指向的字符。这两种尝试操作的目的,都是为了通过删除一个字符,看能否使剩余的字符串成为回文。除此之外,我们还可以充分利用之前已经遍历过的字符的下标信息,优化代码的逻辑结构和实现方式,最终得到如下代码:

# include <iostream>
# include <algorithm>
using namespace std;
struct result {bool palindrome;int start;int end;
};result isPalindrome(string s,int i,int j) {cout<<s<<endl;int len=s.length();for(; i<len/2; ++i,--j) {if(s[i]!=s[j]) {result res= {false,i,j};return res;}}result res= {true,-1,-1};return res;
}
bool checkPalindrome(string s) {int len=s.length();result res=isPalindrome(s,0,len-1);if(res.palindrome) {return true;} else {string str1=s,str2=s;return isPalindrome(str1.erase(res.start,1),res.start,res.end-1).palindrome||isPalindrome(str2.erase(res.end,1),res.start,res.end-1).palindrome;}
}int main() {string s="abca";cout<<"最多删除一个字符后,是否是回文字符串:"<<checkPalindrome(s)<<endl;return 0;
}

在这里插入图片描述
    这里积累一个字符串处理的方法erase(int pos, int count),可用于删除字符串指定元素。显然这里的时间复杂度为O(n)。

题目二:回文子字符串的个数

在这里插入图片描述

    这里题目所求的是子字符串的个数,而非种类,这是一个容易混淆的关键要点。其实,这道题的解题思路并不复杂,我们可以直接对原字符串进行从左到右的顺序遍历。在遍历的过程中,每遇到一个字符,我们都将其作为一个关键的边界点,以此为中心向字符串的两边进行扩展操作。在这个扩展的过程中,一个重要的考虑因素就是要判断当前这个字符是作为奇数长度回文子串的中间字符,还是作为偶数长度回文子串的中间字符。如果是偶数长度回文子串的中间字符,那么为了构成完整的偶数对结构,就需要在这个字符的右侧再补充一个字符,从而满足偶数长度回文子串的特征。基于这样的思路和逻辑,我们便可以通过相应的代码实现来解决这个问题,得到如下代码:

# include <iostream>
# include <algorithm>
using namespace std;int countPalindromeStr(string s,int i,int j) {int count=0,len=s.length();while(i>=0&&j<len&&s[i]==s[j]) {count++;i--;j++;}return count;
}int main() {string s="aaa";int count=0;for(int i=0,len=s.length(); i<len; ++i) {count+=countPalindromeStr(s,i,i);count+=countPalindromeStr(s,i,i+1);}cout<<"输出回文子字符串的个数:"<<count<<endl;return 0;
}

题目三:删除倒数第k个节点

在这里插入图片描述

    这道题目属于链表基础类型的题目,通常采用的是快慢指针法来高效解决。具体的操作步骤为:首先选取两个指针,分别命名为 front 和 end。在算法开始执行时,front 和 end 指针都会指向链表的第一个节点。接下来,我们会先让 end 指针向后移动(k - 1)个位置。这么做的目的在于,在后续的同步移动过程中,front 和 end 指针之间能够保持(k - 1)个节点的间隔。当 end 指针完成这(k - 1)个位置的移动后,front 和 end 指针会开始同步向后移动,也就是每当 end 指针向后移动一个节点,front 指针也会相应地向后移动一个节点。这个同步移动的过程会持续进行,直到 end 指针指向链表的最后一个节点。由于 front 和 end 指针之间始终保持着(k - 1)个节点的间隔,所以当 end 指针指向最后一个节点时,front 指针此时所指向的节点就是我们要找的目标节点,也就是链表中的倒数第 k 个节点。利用这种快慢指针的方法,我们可以在一次遍历链表的过程中准确找到倒数第 k 个节点,有效提升了算法的效率。

# include <iostream>
# include <algorithm>
using namespace std;
struct linkNode {int data;linkNode * next;linkNode(int val):data(val),next(nullptr) {}
};
typedef linkNode * linkList;linkList createLinkList(int arr[],int len) {//使用空头链表linkList head=new linkNode(0),q=head;for(int i=0; i<len; ++i) {linkNode * p=new linkNode(arr[i]);q->next=p;q=p;}q->next=nullptr;return head;
}
void printLinkList(linkList head) {linkList p=head;while(p!=nullptr) {cout<<p->data<<" ";p=p->next;}
}int main() {int arr[]= {1,2,3,4,5,6};int k=2,start=k;linkList head= createLinkList(arr,6);linkNode * front=head->next,*end=head->next;cout<<"原链表:";printLinkList(head);cout<<endl; while(k--) {end=end->next;}while(end){front=front->next;end=end->next;}cout<<"输出倒数第"<<start<<"个数:"<<front->data<<endl;return 0;
}

    我是【Jerry说前后端】,本系列精心挑选的算法题目全部基于经典的《剑指 Offer(数据结构与算法面试题精讲)》。在如今竞争激烈的技术求职环境下,算法能力已成为前端开发岗位笔试考核的关键要点。通过深入钻研这一系列算法题,大家能够系统地积累算法知识和解题经验。每一道题目的分析与解答过程,都像是一把钥匙,为大家打开一扇通往高效编程思维的大门,帮助大家逐步提升自己在数据结构运用、算法设计与优化等方面的能力。
    无论是即将踏入职场的应届毕业生,还是想要进一步提升自己技术水平的在职开发者,掌握扎实的算法知识都是提升竞争力的有力武器。希望大家能跟随我的步伐,在这个系列中不断学习、不断进步,为即将到来的前端笔试做好充分准备,顺利拿下心仪的工作机会!快来订阅吧,让我们一起开启这段算法学习之旅!

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

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

相关文章

2025年常见渗透测试面试题(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 常见面试题 一、渗透测试经历与技术复盘 二、高频漏洞类型与攻防体系 三、渗透工具链与技术特性 四、…

大数据与人工智能之大数据架构(Hadoop、Spark、Flink)

一、核心特性与架构设计 1. Hadoop&#xff1a;分布式批处理的基石 核心组件&#xff1a; HDFS&#xff1a;分布式文件系统&#xff0c;支持大规模数据存储。MapReduce&#xff1a;基于“分而治之”的批处理模型&#xff0c;适合离线分析。 架构特点&#xff1a; 批处理主导&…

从IoT到AIoT:智能边界的拓展与AI未来趋势预测

文章目录 引言&#xff1a;从连接万物到感知万物1. AIoT的本质&#xff1a;将智能嵌入万物2. AIoT的推动力量与挑战2.1 推动力量2.2 关键挑战 3. 五大AIoT未来趋势预测趋势一&#xff1a;边缘智能将成为主流架构趋势二&#xff1a;AI模型将向自适应与多任务演进趋势三&#xff…

从本地新建文件夹到拉取远程仓库 dev 分支的完整步骤

《从本地新建文件夹到拉取远程仓库 dev 分支的完整步骤》 下面为你详细介绍从本地新建文件夹开始&#xff0c;将远程仓库的 dev 分支拉取到本地的具体步骤&#xff1a; 1. 创建新文件夹 在本地电脑上新建一个文件夹&#xff0c;作为存放项目代码的目录。你可以通过图形界面操…

python/pytorch杂聊

Dataset 是否需要自己定义&#xff1a;如果你使用的数据集不是 PyTorch 提供的标准数据集&#xff08;如 MNIST、CIFAR-10 等&#xff09;&#xff0c;那么你需要继承 torch.utils.data.Dataset 类并实现两个方法&#xff1a;__len__() 和 __getitem__()。__len__() 应该返回数…

PHP 安全 E-mail

PHP 安全 E-mail 引言 随着互联网的普及和电子商务的发展,电子邮件成为了人们日常生活中不可或缺的通信工具。PHP作为一种广泛使用的服务器端脚本语言,也经常被用于发送和接收电子邮件。然而,在PHP中处理电子邮件时,安全性问题不容忽视。本文将深入探讨PHP安全发送电子邮…

【夜话系列】DelayQueue延迟队列(下):实战应用与面试精讲

🔥 本文是DelayQueue系列的下篇,聚焦实战应用场景和性能优化。通过多个真实案例,带你掌握DelayQueue在项目中的最佳实践和性能调优技巧。 📚 系列专栏推荐: JAVA集合专栏 【夜话集】JVM知识专栏数据库sql理论与实战小游戏开发文章目录 一、DelayQueue实战应用1.1 订单超…

Redis(笔记)

简介&#xff1a; 常用数据类型: 常用操作命令&#xff1a; Redis的Java客户端&#xff1a; 操作字符串类型的数据&#xff1a; 操作Hash类型的数据&#xff1a; 操作列表类型的数据&#xff1a; 操作集合类型的数据&#xff1a; 操作有序集合类型数据&#xff1a; 通用命令…

PhotoShop学习05

1.选区基础知识 选区&#xff0c;就是选定一些区域&#xff0c;我们对图片的更改只在选区内生效&#xff0c;这样可以精细调整图片的部分而不会影响整体。它的快捷键是M。 我们用点击鼠标后滑动就会出现虚线框&#xff0c;虚线框内的就是我们选定的区域。这时我们再滑动就会创…

使用Redission实现分布式锁

分布式锁在分布式系统中非常重要&#xff0c;主要用于解决多个进程/服务并发访问共享资源时的数据一致性问题。在日常开发中常用于&#xff1a; 1. 防止重复操作&#xff08;幂等性控制&#xff09; 场景&#xff1a;用户重复提交订单、重复支付、重复点击等。 示例&#xff1…

VScode 画时序图(FPGA)

1、先安装插件&#xff1a; 2、然后就可以编写一个.js文件&#xff0c;如下&#xff1a; {signal: [{name: clk, wave: p.......|..},{name: rstn, wave: 01......|..},{name: din_vld, wave: 0.1.0...|..},{name: din, wave: "x.x...|..", data: ["D0", …

嵌入式学习笔记——I2C

IIC协议详解 一、IIC协议简介二、IIC总线结构图三、IIC通信流程详解1. 空闲状态 : 双高空闲2. 起始信号&#xff08;START&#xff09;: 时高数下开始3. 停止信号&#xff08;STOP&#xff09;: 时高数上结束4. 数据传输格式 : 时高数稳&#xff0c;时低数变5. 应答信号 四、写…

Apifox Helper 与 Swagger3 区别

核心定位差异 Apifox Helper 定位&#xff1a;基于 IDEA 的代码注释解析工具&#xff0c;与 Apifox 平台深度集成&#xff0c;实现文档自动生成接口管理测试协作的一体化流程。 特点&#xff1a; 通过解析 Javadoc、KDoc 等注释生成文档&#xff0c;代码零侵入&#xff08;无…

单片机实现多线程的方法汇总

在单片机上实现“多线程”的方法有几种&#xff0c;下面按照从简单到复杂、从轻量到系统性来列出常见的方案&#xff1a; &#x1f9f5; 一、伪多线程&#xff08;最轻量&#xff09; 方法&#xff1a;主循环 状态机 / 定时器轮询 主循环中轮流调用各个任务的处理函数&#x…

网络:华为数通HCIA学习:静态路由基础

文章目录 前言静态路由基础静态路由应用场景 静态路由配置静态路由在串行网络的配置静态路由在以太网中的配置 负载分担配置验证 路由备份&#xff08;浮动静态路由&#xff09;配置验证 缺省路由配置验证 总结 华为HCIA 基础实验&#xff0d;静态路由 & eNSP静态路由 基础…

[项目总结] 在线OJ刷题系统项目技术应用(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Qt音频输出:QAudioOutput详解与示例

1. 简介 QAudioOutput是Qt多媒体框架中的一个关键类&#xff0c;它提供了将PCM&#xff08;脉冲编码调制&#xff09;原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分&#xff0c;QAudioOutput允许开发者在应用程序中实现音频播放功能&#xff0c;支持多种音…

【计算机网络】Linux配置SNAT/DNAT策略

什么是NAT&#xff1f; NAT 全称是 Network Address Translation&#xff08;网络地址转换&#xff09;&#xff0c;是一个用来在多个设备共享一个公网 IP上网的技术。 NAT 的核心作用&#xff1a;将一个网络中的私有 IP 地址&#xff0c;转换为公网 IP 地址&#xff0c;从而…

Redis淘汰策略详解!

目录 一、为什么需要淘汰策略&#xff1f; &#x1f914;二、Redis 的淘汰策略详解 &#x1f447;三、如何选择合适的淘汰策略&#xff1f; &#x1f914;➡️✅四、如何切换 Redis 的淘汰策略&#xff1f; ⚙️&#x1f527;五、总结 &#x1f389; &#x1f31f;我的其他文章…

存储基石:深度解读Linux磁盘管理机制与文件系统实战

Linux系列 文章目录 Linux系列前言一、磁盘1.1 初识磁盘1.2 磁盘的物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构 二、文件系统2.1 系统对磁盘的管理2.2 文件在磁盘中的操作 前言 Linux 文件系统是操作系统中用于管理和组织存储设备&#xff08;如硬盘、SSD、USB 等&#xff…