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+1
            dp[i].resize(i + 1);

            // 设置边界值:第一个和最后一个元素为 1
            dp[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),是生成杨辉三角的经典实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯备考:动态规划路径类DP之矩阵的最小路径和

如题&#xff0c;要求左上角到右下角的最短路径&#xff0c;我们还是老样子按顺序做 step1:确定状态表示 f[i][j]表示(1,1)到(i,j)的最短距离 step2 :推导状态表达方程 step3:确定填表顺序&#xff0c;应该是从上到下&#xff0c;从左到右 step4:初始化 step5 找结果&#…

18类创新平台培育入库!长沙经开区2025年各类科技创新平台培育申报流程时间材料及申报条件

长沙经开区打算申报企业研发中心、技术创新中心、工程技术研究中心、新型研发机构、重点实验室、概念验证中心和中试平台、工程研究中心、企业技术中心、制造业创新中心、工业设计中心等创新平台的可先备案培育入库&#xff0c;2025年各类平台的认定将从培育库中优先推荐&#…

CyberDefenders----WebStrike Lab

WebStrike Lab 实验室链接 简介: 公司网络服务器上发现了一个可疑文件,在内联网中发出警报。开发团队标记了异常,怀疑存在潜在的恶意活动。为了解决这个问题,网络团队捕获了关键网络流量并准备了一个 PCAP 文件以供审查。您的任务是分析提供的 PCAP 文件以发现文件的出现…

【python】gunicorn配置

起因&#xff1a;因为cpu利用率低导致我去缩容&#xff0c;虽然缩容之后cpu利用率上升维持在60%左右&#xff0c;但是程序响应耗时增加了。 解释&#xff1a;因为cpu干这件活本身不累&#xff0c;但在干这件活的时候不能去干其他事情&#xff0c;导致并发的请求不能及时响应&am…

SSE vs WebSocket:AI 驱动的实时通信抉择

引言 近年来,基于 Transformer 的大模型推动了 AI 产业的飞速发展,同时带来了新的技术挑战: 流式传输 vs 批量返回:大模型生成的长文本若需一次性返回,会显著影响用户体验,实时推送成为必需。语音交互需求:语音助手要求毫秒级响应,而非等待用户完整输入后再返回结果。…

基于海思soc的智能产品开发(芯片sdk和linux开发关系)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 随着国产化芯片的推进&#xff0c;在soc领域&#xff0c;越来越多的项目使用国产soc芯片。这些soc芯片&#xff0c;通常来说运行的os不是linux&…

各种DCC软件使用Datasmith导入UE教程

3Dmax: 先安装插件 https://www.unrealengine.com/zh-CN/datasmith/plugins 左上角导出即可 虚幻中勾选3个插件,重启引擎 左上角选择文件导入即可 Blender导入Datasmith进UE 需要两个插件, 文章最下方链接进去下载安装即可 一样的,直接导出,然后UE导入即可 C4D 直接保存成…

VMware Fusion虚拟机Mac版安装Ubuntu系统

介绍 Ubuntu操作系统是一个基于Linux内核的桌面和服务器操作系统。它由Canonical公司开发和维护&#xff0c;是最受欢迎的Linux操作系统之一。Ubuntu操作系统以简洁、直观和易用为设计原则&#xff0c;提供了友好的图形界面&#xff0c;支持多种语言和自定义设置&#xff0c;用…

发行思考:全球热销榜的频繁变动

几点杂感&#xff1a; 1、单机游戏销量与在线人数的衰退是剧烈的&#xff0c;有明显的周期性&#xff0c;而在线游戏则稳定很多。 如去年的某明星游戏&#xff0c;最高200多万在线&#xff0c;如今在线人数是48名&#xff0c;3万多。 而近期热门的是MH&#xff0c;在线人数8…

AI赋能科研绘图与数据可视化高级应用

在科研成果竞争日益激烈的当下&#xff0c;「一图胜千言」已成为高水平SCI期刊的硬性门槛——数据显示很多情况的拒稿与图表质量直接相关。科研人员普遍面临的工具效率低、设计规范缺失、多维数据呈现难等痛点&#xff0c;因此科研绘图已成为成果撰写中的至关重要的一个环节&am…

thingsboard edge 在windows 环境下的配置

按照官方文档&#xff1a;Installing ThingsBoard Edge on Windows | ThingsBoard Edge&#xff0c;配置好java环境和PostgreSQL。 下载对应的windows 环境下的tb-edge安装包。下载附件 接下来操作具体如下 步骤1&#xff0c;需要先在thingsboard 服务上开启edge 权限 步骤2…

最硬核DNS详解

1、是什么 DNS&#xff08;域名系统&#xff09;是互联网的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。DNS协议基于UDP协议&#xff0c;使用端口号53。 2、域名服务器类型 域名服务器在DNS体系中扮演着不…

CentOS 7 安装Nginx-1.26.3

无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载&#xff1a; http://nginx.org/download/nginx-1.26.3.zipLinxu下载 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安装Nginx-1.26.3 安装之前先安装Nginx依赖包、自行选择 yum -y i…

基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践

近年来&#xff0c;随着国产AI芯片的日益崛起&#xff0c;基于国产AI芯片的模型适配、性能优化以及应用落地是国产AI应用的一道重要关卡。如何在复杂的京东零售业务场景下更好地使用国产AI芯片&#xff0c;并保障算力安全&#xff0c;是目前亟需解决的问题。对此&#xff0c;京…

osg官方例子

osg3.6.5官方例子 osganimate osganimationeasemotion osganimationmakepath osganimationmorph

分享react后台管理系统常见的组件/知识点

前言 虽然各个前端框架的常用组件库已经非常完善&#xff0c;但做具体业务时&#xff0c;一般情况下&#xff0c;我们无法直接套用组件&#xff0c;需要自己进行撰写对应业务逻辑。 这篇文章总结做react表单列表常见的组件/知识点。 注意&#xff1a;本篇仅提供相关功能的核心…

自动驾驶---不依赖地图的大模型轨迹预测

1 前言 早期传统自动驾驶方案通常依赖高精地图&#xff08;HD Map&#xff09;提供道路结构、车道线、交通规则等信息&#xff0c;可参考博客《自动驾驶---方案从有图迈进无图》&#xff0c;本质上还是存在问题&#xff1a; 数据依赖性高&#xff1a;地图构建成本昂贵&#xf…

如何在您的 QQ机器人 中集成 码本 AI 模型!

如何在您的QQ机器人中集成 码本 AI 模型&#xff01; 开源技术栏 通过使用此工具&#xff0c;您可以轻松地将 码本 API 服务 集成到您的 QQ 机器人 中&#xff0c;实现快速部署和运行。 这个工具专为简化复杂流程设计&#xff0c;即便是初学者也能轻松上手&#xff0c;让您的…

Java与数据库

目录 一.本文焦点&#xff1a; 二.数据库常用数据类型 三.对数据库操作 四.对数据库中的表操作 五.条件表达 六. 表查询操作进阶 1.多表连接查询 1&#xff09;交叉连接查询 2&#xff09;内连接&#xff08;取两表交集&#xff09; 3&#xff09;外连接 4&#xff09…

基于ANTLR4的大数据SQL编辑器解析引擎实践|得物技术

一、背景 随着得物离线业务的快速增长&#xff0c;为了脱离全托管服务的一些限制和享受技术发展带来的成本优化&#xff0c;公司提出了大数据Galaxy开源演进项目&#xff0c;将离线业务从全托管且封闭的环境迁移到一个开源且自主可控的生态系统中&#xff0c;而离线开发治理套…