Leetcode刷题笔记10

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;

}

 

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

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

相关文章

爬虫相关面试题(其二)

十一 分布式爬虫爬虫原理 一个分布式爬虫&#xff0c;是需要有一个或多个发任务的程序&#xff0c;提取将来需要的任务&#xff0c;主要指的就是任务链接&#xff0c;存到任务队列&#xff08;redis数据库中&#xff09;&#xff0c;还需要多个执行任务的程序&#xff0c;从任…

微软无所不知的人工智能召回功能“Recall”被推迟,将不会与 Copilot Plus PC 一起提供

微软计划下周推出新的 Copilot Plus 个人电脑&#xff0c;取消其备受争议的 Recall 功能&#xff0c;该功能可以截取您在这些新笔记本电脑上所做的所有操作。该软件制造商推迟了 Recall&#xff0c;以便可以通过 Windows Insider 程序对其进行测试&#xff0c;此前该公司最初承…

解决CentOS的yum命令失效的问题

近日笔者对一台装有 CentOS 7.9 系统的服务器反复折腾&#xff0c;玩到最后发现 yum 命令用不了&#xff0c;总是报下面的错误信息&#xff1a; There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/usr/l…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功

服务器数据恢复—vxfs文件系统元数据被破坏的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌MSA2000服务器存储中有一组由8块SAS硬盘组建的raid5磁盘阵列&#xff0c;其中包含一块热备盘。分配了6个LUN&#xff0c;均分配给HP-Unix小机使用。磁盘分区由LVM进行管理&#xff0c;存放的数据主要为Oracle数据库及OA服务端。 服务…

企业数据放到公有云上安全吗?

将企业数据放置在公有云上是否安全&#xff0c;取决于多种因素&#xff0c;包括所选择的云服务提供商、数据类型、行业合规要求、以及企业本身的安全策略和实践。下面是一些关键点&#xff0c;可以帮助理解公有云上的数据安全性&#xff1a; 公有云提供商的安全措施 物理安全与…

【PL理论】(23) 函数式语言:let-in 示例的分解 | 谁在使用动态作用域?

&#x1f4ad; 写在前面&#xff1a;本章我们将对函数式语言的讲解进行收尾&#xff0c;分解一下之前讲的 let-in 示例。然后讨论一下谁在使用动态作用域。 目录 0x00 let-in 示例的分解 0x01 谁使用动态作用域&#xff1f; 0x00 let-in 示例的分解 让我们详细检查这个示例…

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈&#xff1a;vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码

建议收藏!亚马逊卖家必须知道的37个常用术语解释

运营亚马逊&#xff0c;经常会看到很多个专业术语&#xff0c;想必大部分新手卖家都比较陌生&#xff0c;熟悉这些常用术语的含义有助于你更好地运营亚马逊。下面为各位整理了37个在亚马逊跨境电商中常见的术语及其解释&#xff0c;建议收藏&#xff01; 1、SKU Stock Keeping…

揭秘数据资产的核心价值:从数据收集到分析应用的全方位解决方案,引领企业驶向智能化未来

一、引言 在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最重要的资产之一。从海量的数据中提取有价值的信息&#xff0c;转化为企业的竞争优势&#xff0c;是每一家企业都面临的挑战和机遇。本文将深入探讨数据资产的核心价值&#xff0c;以及如何通过从数据收集到分…

Ubuntu18.04 安装 colmap

安装依赖 sudo apt-get install \git \cmake \ninja-build \build-essential \libboost-program-options-dev \libboost-filesystem-dev \libboost-graph-dev \libboost-system-dev \libeigen3-dev \libflann-dev \libfreeimage-dev \libmetis-dev \libgoogle-glog-dev \libgt…

搭建 Redis 集群【Windows】

Redis 集群是一个分布式存储解决方案&#xff0c;它将数据分布在多个Redis节点上&#xff0c;以提高系统的可伸缩性、可靠性和性能。 1. 集群概念与特点 集群概念&#xff1a;Redis集群是由多个相互独立的 Redis 节点组成&#xff0c;这些节点通过高速网络互联&#xff0c;并作…

企业应该先上ERP系统还是先实施MES管理系统

在当今日益激烈的市场竞争中&#xff0c;企业信息化已成为提升竞争力的关键。ERP系统与MES管理系统作为企业信息化建设的两大核心系统&#xff0c;各自扮演着不可或缺的角色。然而&#xff0c;在资源有限的情况下&#xff0c;企业往往需要在两者之间做出选择。本文将深入探讨ER…

代码随想录算法训练营第36期 last day

最后一次更新&#xff0c;之后去复习专业课和简历 583两个字符串的删除操作 自己做出来了&#xff1a; Code: class Solution {public://找到公共子序列的最大长度dp 最小步数串1.size-dp串2.size-dp int minDistance(string word1, string word2) { vector<v…

Python武器库开发-武器库篇之SSH服务暴力破解(五十四)

Python武器库开发-武器库篇之SSH服务暴力破解(五十四) SSH&#xff08;Secure Shell&#xff09;是一种加密的网络协议&#xff0c;用于在不安全的网络上提供安全的远程登录和文件传输功能。SSH可以在客户端和服务器之间建立安全的通信连接&#xff0c;确保通信数据的机密性和…

10W大奖等你瓜分,OpenTiny CCF开源创新大赛报名火热启动!

OpenTiny CCF开源创新大赛正式启幕&#xff01; &#x1f31f;10万奖金&#xff0c;等你来战&#xff01; &#x1f31f; &#x1f465;无论你是独行侠还是团队英雄&#x1f465; 只要你对前端技术充满热情&#xff0c; 渴望在实战中磨砺技能&#xff0c; 那么&#xff0c…

如何评估员工在新版FMEA培训后应用知识的效果?

随着制造业的快速发展&#xff0c;新版FMEA已成为企业提升产品质量、减少故障风险的关键一环。然而&#xff0c;培训只是第一步&#xff0c;如何有效评估员工在新版FMEA培训后应用知识的效果&#xff0c;才是确保培训成果转化的关键所在。 评估员工知识应用效果的首要步骤是制定…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计&#xff0c;涵盖博客、电商网站及企业官网的布局实例&#xff0c;包括头部导航、内容区域、侧边栏、页脚…

vue生命周期及组件讲解(如何导入引用外部vue文件,以及注册全局变量,自定义标签效果)

生命周期钩子的理解与应用 函数说明onBeforeMount( )组件挂载前onMounted( )组件挂载后onBeforeUpdate( )组件更新前onUpdated( )组件中任意的DOM元素更新后onBeforeUnmount( )组件实例被销毁前onUnmounted( )组件实例被销毁后 生命周期在 各类应用以及网站中使用非常广泛&…

MySQL Online DDL原理解读

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…