C/C++蓝桥杯算法真题打卡(Day1)

一、LCR 018. 验证回文串 - 力扣(LeetCode)

算法代码: 

class Solution {
public:bool isPalindrome(string s) {int n = s.size();// 处理一下s为空字符的情况if (n == 0) {return true; // 修正拼写错误}// 定义左右指针遍历字符串int left = 0;int right = n - 1; // 修正右指针初始化while (left < right) {// 左右对非字母数字字符的处理是直接跳过while (left < right && !isalnum(s[left])) {left++;}while (left < right && !isalnum(s[right])) {right--;}// 处理大小写的情况,统一转换为小写if (s[left] >= 'A' && s[left] <= 'Z') {s[left] += 32;}if (s[right] >= 'A' && s[right] <= 'Z') {s[right] += 32;}// 然后判断是不是相同的字符,若是则直接跳过if (s[left] == s[right]) {left++;right--;} else {return false;}}return true;}
};

代码思路

  1. 处理空字符串

    • 如果字符串 s 为空(n == 0),直接返回 true,因为题目定义空字符串为有效回文串。

  2. 初始化左右指针

    • 定义左指针 left,初始化为 0,指向字符串的开头。

    • 定义右指针 right,初始化为 n - 1,指向字符串的末尾。

  3. 主循环:左右指针向中间移动

    • 使用 while (left < right) 循环,确保左右指针没有相遇或交叉。

    • 在循环中,分别处理左指针和右指针指向的字符。

  4. 跳过非字母数字字符

    • 使用 isalnum 函数检查当前字符是否为字母或数字。

    • 如果不是字母或数字,则移动指针(左指针向右移动,右指针向左移动),直到找到字母或数字字符。

  5. 统一字符大小写

    • 如果字符是大写字母(A-Z),将其转换为小写字母(a-z),以便在比较时忽略大小写。

  6. 比较字符

    • 如果左右指针指向的字符相等,则继续向中间移动指针(left++ 和 right--)。

    • 如果字符不相等,则直接返回 false,说明字符串不是回文串。

  7. 循环结束

    • 如果循环正常结束(即左右指针相遇或交叉),说明所有字符都匹配,返回 true,表示字符串是回文串。


代码优化建议

  1. 避免修改原始字符串

    • 你的代码中直接修改了字符串 s 中的字符(如 s[left] += 32)。虽然这不会影响结果,但为了代码的健壮性,建议避免修改输入数据。

    • 可以使用 tolower 函数直接在比较时转换字符大小写,而不修改原始字符串。

  2. 使用 tolower 函数

    • tolower 是 C++ 标准库函数,可以直接将字符转换为小写,避免手动计算 ASCII 值。

优化后的代码如下:

class Solution {
public:bool isPalindrome(string s) {int n = s.size();// 处理空字符串if (n == 0) {return true;}int left = 0;int right = n - 1;while (left < right) {// 跳过非字母数字字符while (left < right && !isalnum(s[left])) {left++;}while (left < right && !isalnum(s[right])) {right--;}// 统一转换为小写并比较if (tolower(s[left]) != tolower(s[right])) {return false;}// 移动指针left++;right--;}return true;}
};

代码思路总结

步骤操作说明
1处理空字符串如果字符串为空,直接返回 true
2初始化左右指针left 指向开头,right 指向末尾。
3主循环当 left < right 时,继续循环。
4跳过非字母数字字符使用 isalnum 检查并跳过非字母数字字符。
5统一字符大小写使用 tolower 将字符转换为小写。
6比较字符如果字符不相等,返回 false;否则移动指针。
7循环结束如果所有字符都匹配,返回 true

时间复杂度分析

  • 时间复杂度O(n),其中 n 是字符串的长度。每个字符最多被访问一次。

  • 空间复杂度O(1),只使用了常数级别的额外空间。

二、118. 杨辉三角 - 力扣(LeetCode) 

算法代码: 

class Solution {
public:vector<vector<int>> generate(int numRows) {// 初始化 DP 表vector<vector<int>> dp(numRows);// 生成每一行for (int i = 0; i < numRows; i++) {// 调整当前行的大小为 i+1dp[i].resize(i + 1);// 设置边界值:第一个和最后一个元素为 1dp[i][0] = dp[i][i] = 1;// 计算中间元素for (int j = 1; j < i; j++) {dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];}}// 返回生成的杨辉三角return dp;}
};

代码思路

  1. 初始化 DP 表

    • 创建一个二维向量 dp,用于存储杨辉三角的每一行。

    • dp 的大小为 numRows,表示杨辉三角的行数。

  2. 生成每一行

    • 使用一个外层循环遍历每一行(从 0 到 numRows - 1)。

    • 对于每一行 i,调整其大小为 i + 1(因为第 i 行有 i + 1 个元素)。

  3. 设置边界值

    • 每一行的第一个元素和最后一个元素总是 1,即:

      dp[i][0] = dp[i][i] = 1;
  4. 计算中间元素

    • 使用一个内层循环计算每一行的中间元素(从第 2 个元素到倒数第 2 个元素)。

    • 每个中间元素等于它左上方和右上方元素的和,即:

      dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
  5. 返回结果

    • 最终返回 dp 表,即生成的杨辉三角。


代码执行流程

  1. 初始化

    • dp 表被创建,大小为 numRows,每一行是一个空的 vector<int>

  2. 生成每一行

    • 对于第 i 行:

      • 调整大小为 i + 1

      • 设置第一个和最后一个元素为 1

      • 计算中间元素(如果存在)。

  3. 返回结果

    • 返回完整的 dp 表。


示例

假设 numRows = 5,代码的执行过程如下:

  1. 第 0 行

    • 调整大小为 1

    • 设置 dp[0][0] = 1

    • 行内容:[1]

  2. 第 1 行

    • 调整大小为 2

    • 设置 dp[1][0] = 1 和 dp[1][1] = 1

    • 行内容:[1, 1]

  3. 第 2 行

    • 调整大小为 3

    • 设置 dp[2][0] = 1 和 dp[2][2] = 1

    • 计算中间元素:dp[2][1] = dp[1][0] + dp[1][1] = 1 + 1 = 2

    • 行内容:[1, 2, 1]

  4. 第 3 行

    • 调整大小为 4

    • 设置 dp[3][0] = 1 和 dp[3][3] = 1

    • 计算中间元素:

      • dp[3][1] = dp[2][0] + dp[2][1] = 1 + 2 = 3

      • dp[3][2] = dp[2][1] + dp[2][2] = 2 + 1 = 3

    • 行内容:[1, 3, 3, 1]

  5. 第 4 行

    • 调整大小为 5

    • 设置 dp[4][0] = 1 和 dp[4][4] = 1

    • 计算中间元素:

      • dp[4][1] = dp[3][0] + dp[3][1] = 1 + 3 = 4

      • dp[4][2] = dp[3][1] + dp[3][2] = 3 + 3 = 6

      • dp[4][3] = dp[3][2] + dp[3][3] = 3 + 1 = 4

    • 行内容:[1, 4, 6, 4, 1]


最终结果

[[1],[1, 1],[1, 2, 1],[1, 3, 3, 1],[1, 4, 6, 4, 1]
]

复杂度分析

  1. 时间复杂度

    • 生成每一行需要 O(i) 的时间,其中 i 是行号。

    • 总时间复杂度为:

    • 其中 n=numRows。

  2. 空间复杂度

    • 需要存储整个杨辉三角,空间复杂度为 O(n2)。


总结

  • 代码通过动态规划(DP)表的方式生成杨辉三角,思路清晰且高效。

  • 使用 resize 为每一行分配空间,并通过状态转移方程计算中间元素。

  • 代码的时间复杂度和空间复杂度均为 O(n2),是生成杨辉三角的经典实现。

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

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

相关文章

SpringUI高保真动态交互元件库:助力产品原型设计

SpringUI 是一个专为Web设计与开发领域打造的高质量、全面且易于使用的交互元件集合。通过提供一系列预制的、高质量的交互组件&#xff0c;帮助设计师快速构建出功能丰富、界面美观的原型。 ————基础元件&#xff1a; ——————按钮 Button&#xff1a;基础按钮、禁用…

vue+neo4j 四大名著知识图谱问答系统

编号: D039 视频 vueneo4j四大名著知识图谱问答系统 技术架构 vuedjangoneo4jmysql技术实现 功能模块图 问答&#xff1a;基于知识图谱检索、支持图多跳、显示推理路径 姜维的师傅的主公的臣是谁&#xff1a; 马谡 知识图谱&#xff1a;四大名著总共4个图谱 红楼梦图谱 …

学习使用ESP8266进行MQTT通信并在网页上可视化显示

目录 一、工具 二、 流程 三、代码实现 设置MQTT服务器地址 设置服务器和端口号 连接MQTT服务器并订阅话题 回调处理函数 发布数据到话题 四、调试软件使用 打开MQTTx 添加话题 五、网页使用 一、工具 arduino ide esp8266/32单片机 lot物联网网页 MQTTx软件或者m…

大模型应用开发学习笔记

Huggingface 下载模型&#xff1a; model_dirr"G:\python_ws_g\code\LLMProject\session_4\day02_huggingface\transformers_test\model\uer\uer\gpt2-chinese-cluecorpussmall\models--uer--gpt2-chinese-cluecorpussmall\snapshots\c2c0249d8a2731f269414cc3b22dff021…

虚拟卡 WildCard (野卡) 保姆级开卡教程

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学&#xff0c;要了解不同平台&#xff08;Grok、Talkatone 等&#xff09;的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时&#xff0c;一般都需要使…

C++实现3D(EasyX)详细教程

一、关于3D 我们看见&#xff0c;这两个三角形是相似的&#xff0c;因此计算很简单 若相对物体的方向是斜的&#xff0c;计算三角函数即可 不会的看代码 二、EasyX简介 initgraph(长,宽) 打开绘图 或initgraph(长,宽…

Qt 进度条与多线程应用、基于 Qt 的文件复制工具开发

练习1&#xff1a;Qt 进度条与多线程应用 题目描述 开发一个基于 Qt 的应用程序&#xff0c;该应用程序包含一个水平进度条&#xff08;QSlider&#xff09;&#xff0c;并且需要通过多线程来更新进度条的值。请根据以下要求完成代码&#xff1a; 界面设计&#xff1a; 使用 QS…

【算法day2】无重复字符的最长子串 两数之和

无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 https://leetcode.cn/problems/longest-substring-without-repeating-characters/ class Solution { public:int lengthOfLongestSubstring(string s) {int sub_length …

XHR请求解密:抓取动态生成数据的方法

在如今动态页面大行其道的时代&#xff0c;传统的静态页面爬虫已无法满足数据采集需求。尤其是在目标网站通过XHR&#xff08;XMLHttpRequest&#xff09;动态加载数据的情况下&#xff0c;如何精准解密XHR请求、捕获动态生成的数据成为关键技术难题。本文将深入剖析XHR请求解密…

【漫话机器学习系列】121.偏导数(Partial Derivative)

偏导数&#xff08;Partial Derivative&#xff09;详解 1. 引言 在数学分析、机器学习、物理学和工程学中&#xff0c;我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量&#xff0c;而是由多个变量共同决定的。那么&#xff0c;当其中某一个变量发生变化时&…

[C语言日寄] 字符串操作函数的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

ssm_mysql_暖心家装平台

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

地下井室可燃气体监测装置:守护地下安全,防患于未“燃”!

在城市的地下&#xff0c;隐藏着无数的燃气管道和井室&#xff0c;它们是城市基础设施建设的重要部分&#xff0c;燃气的使用&#xff0c;给大家的生活提供了极大的便利。在便利生活的背后&#xff0c;也存在潜在的城市安全隐患。 近年来&#xff0c;地下井室可燃气体泄漏事故…

EasyCVR平台赋能农业产业园:AIoT驱动的视频监控与大数据分析解决方案

随着现代农业的快速发展&#xff0c;农业产业园区的规模不断扩大&#xff0c;管理复杂度也随之增加。为了提高农业生产效率、保障农产品质量安全、实现精细化管理和智能化运营&#xff0c;视频信息化建设成为现代农业产业园的重要发展方向。EasyCVR作为一款功能强大的视频监控与…

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题&#xff1a;《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目&#xff1a;https://zju3dv.github.io/StarGen 来源&#xff1a;商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…

STM32 进阶 定时器

在stm32中定时器大概分为4类 1、系统定时器&#xff1a;属于arm内核&#xff0c;内嵌在NVIC中 2、高级定时器&#xff1a;可以用来刹车和死区 3、通用定时器&#xff1a;可以用来输出pwm方波 4、基本定时器&#xff1a;只能记数 系统定时器注意&#xff1a; 1、系统定时器…

day21-API(算法,lambda,练习)

常见的七种查找算法&#xff1a; ​ 数据结构是数据存储的方式&#xff0c;算法是数据计算的方式。所以在开发中&#xff0c;算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词&#xff0c;如果各位铁粉有疑惑&#xff0c;可以先看一下哥们后面录制的数据结构…

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…

Java多线程与高并发专题——为什么 Map 桶中超过 8 个才转为红黑树?

引入 JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点&#xff1a;最开始的 Map 是空的&#xff0c;因为里面没有任何元素&#xff0c;往里放元素时会计算 hash 值&#xff0c;计算之后&#xff0c;第 1 个 value 会首先占用一个桶&#xff08;也称为槽点&#xff…