Leetcode刷题笔记10

news2024/10/7 4:28:49

14. 最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)

首先,检查边界条件

如果输入的字符串数组为空,直接返回空字符串。

然后使用minmax_element函数找到数组中字典序最小和最大的字符串。

因为公共前缀一定会出现在字典序最小和最大的字符串中,所以只需比较这两个字符串的对应字符。

从第一个字符开始,逐个比较最小字符串minStr和最大字符串maxStr的字符:

  • 如果在某个位置,minStrmaxStr的字符不同,则最长公共前缀就是minStr从开头到该位置的子串。
  • 如果所有字符都相同,则最长公共前缀就是整个最小字符串minStr

代码:C++

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // 如果输入字符串数组为空,则返回空字符串
        if(strs.empty()) return "";

        // 使用 minmax_element 来找到字符串数组中最小和最大的字符串
        // p 是一个 pair,p.first 指向最小字符串,p.second 指向最大字符串。
        const auto p = minmax_element(strs.begin(), strs.end());

        // 遍历最小字符串的每一个字符(从第一个字符到最后一个字符)。
        for(int i=0; i<p.first->size(); i++)
        {
            // 如果在某个位置,最小字符串和最大字符串的字符不相同,则返回最小字符串的从开始到当前位置的子串
            if(p.first->at(i) != p.second->at(i))
            {
                //  返回最小字符串从开始到第 i 个位置的子串
                return p.first->substr(0,i);
            }
        }

        // 如果循环结束,说明最小字符串本身就是最长公共前缀
        return *p.first;
    }
};

具体关于string库的各种解释:

const -> 这是一个修饰符,表示变量 p 是常量,不能被修改。
它确保了 p 的值在声明之后不能再被改变

auto -> 这是一个类型说明符,告诉编译器根据右侧的初始化表达式
自动推断变量 p 的类型。在这里,p 的类型是 
std::pair<iterator, iterator>,其中 iterator 是
strs 向量的迭代器类型

p -> 这是变量的名称,它是一个 std::pair,包含两个迭代器,
分别指向 strs 向量中最小和最大的字符串。

minmax_element -> 这是一个标准库函数,
位于 <algorithm> 头文件中。它接受两个迭代器,返回一个 std::pair,
其中第一个元素是范围内的最小元素,第二个元素是范围内的最大元素。

strs.begin() -> 这是一个迭代器,指向 strs 向量的第一个元素。

strs.end() -> 这是一个迭代器,指向 strs 向量的最后一个元素之后的位置。

p.first -> 访问 p 这个 std::pair 的第一个元素,
p.first 是指向 strs 中最小字符串的迭代器。

"->" -> 这是成员访问运算符,用于指向对象的成员。
这里用于访问迭代器指向的字符串的成员函数 at()

at(i) -> 这是字符串类的成员函数,返回字符串中索引为 i 的字符。
如果索引 i 超出范围,会抛出 out_of_range 异常

p.second -> 访问 p 这个 std::pair 的第二个元素,
p.second 是指向 strs 中最大字符串的迭代器

substr(0, i) -> 字符串类的成员函数,返回一个子字符串,
起始位置为 0,长度为 i

*p.first -> 解引用运算符,用于获取指针或迭代器指向的对象。
在这里,*p.first 获取迭代器 p.first 指向的字符串

--------------------------------------------------------------------------
std::string substr (size_t pos = 0, size_t len = npos) const;
pos 是子字符串开始的位置。
len 是子字符串的长度。

当调用 p.first->substr(0, 0) 时:

p.first 是一个指向字符串的指针,假设它指向的是字符串 "dog"。
substr(0, 0) 表示从位置 0 开始,长度为 0。

这意味着从字符串的第一个字符开始,提取长度为 0 的子字符串。
显然,这样的子字符串是一个空字符串。

20. 有效的括号

20. 有效的括号 - 力扣(LeetCode)


 

 

栈是一种后进先出的数据结构,这意味着最后一个压入栈的元素最先弹出。
这种特性特别适合处理成对出现、嵌套结构的问题,比如括号匹配、函数调用栈等。

基本操作:

push:将元素压入栈顶。
pop:将栈顶元素弹出。
top:访问栈顶元素而不弹出。
empty:检查栈是否为空。


栈的后进先出 (LIFO) 特性:

栈是一种后进先出 (LIFO, Last In First Out) 的数据结构,适合处理括号匹配问题。
每当遇到一个左括号时,将其压入栈中;每当遇到一个右括号时,检查栈顶是否是对应的左括号,如果是,则弹出栈顶元素。

匹配括号对:

每个右括号都必须有一个对应的左括号,而且必须按正确的顺序嵌套。通过栈的数据结构,可以轻松实现这种匹配。

字符串遍历:

通过遍历字符串,逐个检查每一个字符是否是括号,并进行相应的处理。这个过程保证了字符串中的每一个括号都被检查和匹配。

代码:C++

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for(auto c : s)
        {
            // 如果c是 ([{ 就入栈
            if(c == '(' || c == '{' || c == '[')
            {
                stk.push(c);
            }
            // 如果c是 )]} 并且栈不为空 则判断栈顶是否为与之对应的左括号 是则出栈,不是则返回false
            else if(c == ')' && !stk.empty() && stk.top() == '(')
            {
                stk.pop();
            }
            else if(c == '}' && !stk.empty() && stk.top() == '{')
            {
                stk.pop();
            }
            else if(c == ']' && !stk.empty() && stk.top() == '[')
            {
                stk.pop();
            }
            else
            {
                // 如果c是 )}] 栈为空 那么返回false
                // 如果c是 )}] 栈不为空, 但是 栈顶不是与c对应的左括号 那么返回false
                return false;
            }
        }
        // 例如"(){}[" , 如果最后栈不为空,那么就是有多余的左括号了
        return stk.empty();
    }
};

优化:

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk; // 定义一个字符栈

        for (char c : s) { // 使用范围 for 循环遍历字符串 s 中的每一个字符 c
            // 如果字符 c 是左括号 (,{ 或 [,则将其压入栈 stk
            if (c == '(' || c == '{' || c == '[') {
                stk.push(c);
            }
            // 如果字符是右括号之一,则进行匹配检查
            else {
                // 检查栈是否为空,如果为空则返回 false,因为没有对应的左括号。
                // 使用辅助函数 isMatchingPair 检查栈顶元素是否与当前右括号匹配,如果不匹配则返回 false
                if (stk.empty() || !isMatchingPair(stk.top(), c)) {
                    return false;
                }
                // 匹配成功,弹出栈顶元素
                stk.pop();
            }
        }

        // 最后检查栈是否为空,如果为空则括号完全匹配,否则有未匹配的左括号
        return stk.empty();
    }

private:
    // 辅助函数,用于检查两个括号是否匹配
    bool isMatchingPair(char left, char right) {
        return (left == '(' && right == ')') ||
               (left == '{' && right == '}') ||
               (left == '[' && right == ']');
    }
};

// 辅助函数 isMatchingPair 用于检查两个括号是否匹配。
// 接受两个字符 left 和 right,如果它们是一对匹配的括号,则返回 true,否则返回 false

什么时候使用for (auto c : s)

什么时候使用for (int i = 0; i < s.size(); i++)

只读遍历且不需要索引:使用 for (auto c : s)。这可以使代码更简洁。
需要索引:使用 for (int i = 0; i < s.size(); i++)。
需要修改元素:使用 for (int i = 0; i < s.size(); i++) 或 for (auto& c : s)(如果不需要索引,但需要修改元素)。

只读遍历:

std::string s = "example";
for (auto c : s) {
    std::cout << c << " ";
}

需要索引:

std::string s = "example";
for (int i = 0; i < s.size(); i++) {
    if (i % 2 == 0) { // 打印偶数索引的字符
        std::cout << s[i] << " ";
    }
}

修改元素:

std::string s = "example";
for (auto& c : s) {
    c = toupper(c); // 将每个字符转换为大写
}
std::cout << s; // 输出 "EXAMPLE"

需要索引且修改元素:

std::vector<int> nums = {1, 2, 3, 4, 5};
for (int i = 0; i < nums.size(); i++) {
    nums[i] *= 2; // 将每个元素乘以2
}
for (auto num : nums) {
    std::cout << num << " "; // 输出 "2 4 6 8 10"
}

HJ73 计算日期到天数转换

计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com)

定义一个累加数组,比如第i个位置是从0累加到i-1的天数

代码:C++

#include <iostream>
using namespace std;

int main() 
{
    // 如果算的是5月,那前面四个月肯定是过完的,直接加上就可以
    int year, month, day;
    cin >> year >> month >> day;

    int monthDays1_N[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
    // [1,month-1]
    int n = monthDays1_N[month-1] + day;

    // 四年一润,百年不润,四百年润一次
    if(month > 2 && ((year % 4 == 0 && year % 100 !=0) || (year % 400 == 0)))
    {
        n += 1;
    }

    cout<<n<<endl;

    return 0;

}

 

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

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

相关文章

Python:基础爬虫

Python爬虫学习&#xff08;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…

用 KV 缓存量化解锁长文本生成

很高兴和大家分享 Hugging Face 的一项新功能: KV 缓存量化 &#xff0c;它能够把你的语言模型的速度提升到一个新水平。 太长不看版: KV 缓存量化可在最小化对生成质量的影响的条件下&#xff0c;减少 LLM 在长文本生成场景下的内存使用量&#xff0c;从而在内存效率和生成速度…

.net 调用海康SDK以及常见的坑解释

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在工控领域,很多时候需要…

【博士每天一篇文献-算法】Progressive Neural Networks

阅读时间&#xff1a;2023-12-12 1 介绍 年份&#xff1a;2016 作者&#xff1a;Andrei A. Rusu,Neil Rabinowitz,Guillaume Desjardins,DeepMind 研究科学家,也都是EWC(Overcoming catastrophic forgetting in neural networks)算法的共同作者。 期刊&#xff1a; 未录用&am…

.NET MAUI Sqlite数据库操作(一)

一、安装 NuGet 包 安装 sqlite-net-pcl 安装 SQLitePCLRawEx.bundle_green 二、配置数据库&#xff08;数据库文件名和路径&#xff09; namespace TodoSQLite; public static class Constants {public const string DatabaseFilename "TodoSQLite.db3";//数据库…

ModuleNotFoundError: No module named ‘MySQLdb‘

python项目运行遇到报错&#xff1a;ModuleNotFoundError: No module named ‘MySQLdb’ 解决办法 1、安装依赖 pip install pymysql2、新增配置 在项目的__init__.py文件中添加以下代码即可解决。 import pymysql pymysql.install_as_MySQLdb()

tim定时器 输入捕获模式下 TIM–ICStructinit(TIM–ICStructinit) 这个值 解析

主要需要看着图来理解 1.这是stm中文手册的图 2.这是解析 我觉得写的不错 注&#xff1a;有个很坑的地方 我觉得是stm32中文手册的问题 他写的解释只写了tim输入2 3 4和ic1 2 3 4&#xff0c;少写了一个输入1 第一次看见很不好理解

vue2动态路由实现

实现一个简单的动态路由&#xff1a; 1、先定义菜单页面组件的结构&#xff0c;使用的是elementUI的NavMenu 导航菜单 <template><div><el-menu default-active"1" router><el-submenu :index"item.path" v-for"item in menu_…

Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

C数据结构:排序

目录 冒泡排序 选择排序 堆排序 插入排序 希尔排序 快速排序 hoare版本 挖坑法 前后指针法 快速排序优化 三数取中法 小区间优化 快速排序非递归 栈版本 队列版本 归并排序 归并排序非递归 ​编辑 计数排序 各排序时间、空间、稳定汇总 冒泡排序 void Bub…

嵌入式linux系统中设备树的经典使用方法

第一:设备树简介 大家好,今天主要给大家分享一下,如何使用linux系统里面的设备树,详细分析如下。 可以参考的官方文档有: 官方文档(可以下载到 devicetree-specification-v0.2.pdf): https://www.devicetree.org/specifications/ 内核文档: …

MNIST手写字符分类

MNIST手写字符分类 文章目录 MNIST手写字符分类1 数据集2 模型构建3 训练4 模型保存5 推理6 模型导出7 导出模型测试 1 数据集 MNIST手写字符集包括60000张用于训练的训练集图片和10000张用于测试的测试集图片&#xff0c;所有图片均归一化为28*28的灰度图像。其中字符区域为白…

LabVIEW水箱液位控制系统

介绍了如何使用LabVIEW软件和硬件工具开发水箱液位控制系统。系统集成了数据采集、实时控制和模拟仿真技术&#xff0c;展示了高精度和高可靠性的特点&#xff0c;适用于需要精细水位调节的工业应用。 项目背景 在制造和化工行业&#xff0c;液位控制是保证生产安全与效率的关…

第3章 Unity 3D着色器系统

3.1 从一个外观着色器程序谈起 新建名为basic_diffuse.shader的文件&#xff0c;被一个名为basic_diffuse.mat的材质文件所引用&#xff0c;而basic_diffuse.mat文件则被场景中名为Sphere的game object的MeshRenderer组件所使用。 basic_diffuse.shader代码文件的内容如下所示…

51.Python-web框架-Django开始第一个应用的增删改查

目录 1.概述 2.创建应用 创建app01 在settings.py里引用app01 3.定义模型 在app01\models.py里创建模型 数据库迁移 4.创建视图 引用头 部门列表视图 部门添加视图 部门编辑视图 部门删除视图 5.创建Template 在app01下创建目录templates 部门列表模板depart.ht…

java+vue3+el-tree实现树形结构操作

基于springboot vue3 elementPlus实现树形结构数据的添加、删除和页面展示 效果如下 代码如下&#xff0c;业务部分可以自行修改 java后台代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.daztk.mes.common.annotation.LogOperation…

高通Android 12 右边导航栏改成底部显示

最近同事说需要修改右边导航栏到底部&#xff0c;问怎么搞&#xff1f;然后看下源码尝试下。 1、Android 12修改代码路径 frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java a/frameworks/base/services/core/java/com/android/server/wm/Display…

树莓派4B_OpenCv学习笔记6:OpenCv识别已知颜色_运用掩膜

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 学了这些OpenCv的理论性知识&#xff0c;不进行实践实在…

Roboflow 图片分类打标

今天准备找个图片标注工具&#xff0c;在网上搜了一下&#xff0c;看 Yolo 的视频中都是用 Roboflow 工具去尝试了一下&#xff0c;标注确实挺好用的&#xff0c;可以先用一些图片训练一个模型&#xff0c;随后用模型进行智能标注。我主要是做标注然后到处到本地进行模型的训练…

springboot的WebFlux 和Servlet

Spring Boot 中的 Servlet 定义&#xff1a; 在 Spring Boot 中&#xff0c;Servlet 应用程序通常基于 Spring MVC&#xff0c;它是一个基于 Servlet API 的 Web 框架。Spring MVC 提供了模型-视图-控制器&#xff08;MVC&#xff09;架构&#xff0c;用于构建 Web 应用程序。…