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是 )]} 并且栈不为空 则判断栈顶是否为与之对应的左括号 是则出栈,不是则返回falseelse 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对应的左括号 那么返回falsereturn false;}}// 例如"(){}[" , 如果最后栈不为空,那么就是有多余的左括号了return stk.empty();}
};

优化:

class Solution {
public:bool isValid(string s) {stack<char> stk; // 定义一个字符栈for (char c : s) { // 使用范围 for 循环遍历字符串 s 中的每一个字符 c// 如果字符 c 是左括号 (,{ 或 [,则将其压入栈 stkif (c == '(' || c == '{' || c == '[') {stk.push(c);}// 如果字符是右括号之一,则进行匹配检查else {// 检查栈是否为空,如果为空则返回 false,因为没有对应的左括号。// 使用辅助函数 isMatchingPair 检查栈顶元素是否与当前右括号匹配,如果不匹配则返回 falseif (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.mzph.cn/web/27059.shtml

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

相关文章

c++实战知识点

c实战知识点 一、概述1.数据2.C11的原始字面量3.数据类型的别名4.const修饰指针5.void关键字6.内存模型7.二级指针8.函数指针和回调函数9.数组10.C风格字符串11.二维数组用于函数的参数行指针&#xff08;数组指针&#xff09; 12.引用引用与const 13.各种形参的使用场景14.重载…

Parallels Desktop for Mac 19.4.0 (build 54570) - 在 Mac 上运行 Windows

Parallels Desktop for Mac 19.4.0 (build 54570) - 在 Mac 上运行 Windows Parallels Desktop 19 请访问原文链接&#xff1a;Parallels Desktop for Mac 19.4.0 (build 54570) - 在 Mac 上运行 Windows&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

Linux 基本指令2

cp 指令 cp[选项]源文件 目标文件 将源文件的内容复制到目标文件中&#xff0c;源文件可以有多个&#xff0c;最后一个文件为目标文件&#xff0c;目标文件也可以是一段路径&#xff0c;若目的地不是一个目录的话会拷贝失败。若没有路径上的目录则会新建一个&#xff0c;若源是…

特殊医学用途配方食品注册数据库

在这个追求健康的时代&#xff0c;特殊医学用途配方食品&#xff08;简称特医食品&#xff09;已成为众多特殊需求人群的膳食选择。它们不仅满足了特定疾病状态下的营养需求&#xff0c;更是病患康复之路上的重要伴侣。然而&#xff0c;面对市场上琳琅满目的特医食品&#xff0…

只要往前走,至少能到达自己所能做到的部分

很多说自己力不足的人&#xff0c;往往是中道而废&#xff0c;在通往目标的途中就失败了。 无论怎么力不足&#xff0c;只要往前走&#xff0c;至少也能到达自己所能做到的部分。 《刻意练习》有个原则&#xff1a;如果有人能做到一件事&#xff0c;其他人就都能做到。 &…

优维运营治理三件套:可用性x性能x容量管理

对于系统/应用运维人员&#xff0c;日常工作中需要保证系统/应用的可用性、稳定性和关注系统/应用的性能表现。为了帮助IT人员更好地管理和优化企业的系统和应用&#xff0c;我们引入了三大关键能力&#xff1a;可用性管理、性能管理和容量管理。这些能力不仅能够帮助IT人员发现…

【ai】blender4.1 安装插件

开源软件,所以资料充足插件及配置 下载插件插件是python开发的 编辑中的偏好设置 点击选中 点击一键切换中文英文 切换主题 插件源码

AI绘画SD下载安装教程,学习AI绘画软件必看(SD怎么安装,SD安装教程,安装stable diffusion软件必看)

大家好&#xff0c;我是设计师阿威 最近很火很有趋势的便是AI人工智能了&#xff0c;提到AI大家肯定都不陌生&#xff08;AIGC&#xff09;大家也很熟知&#xff0c;但是要问应用的工具有哪些肯定很多人说不出来几个&#xff0c;但是比较厉害的就是大众所认识的SD-stable diff…

力扣每日一题 6/14 动态规划+数组

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2786.访问数组中的位置使分数最大【中等】 题目&#xff1a; 给你一个下标…

JavaSE---类和对象(上)

1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。 面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象…

如何用R语言ggplot2画高水平期刊散点图

文章目录 前言一、数据集二、ggplot2画图1、全部代码2、细节拆分1&#xff09;导包2&#xff09;创建图形对象3&#xff09;主题设置4&#xff09;轴设置5&#xff09;图例设置6&#xff09;散点颜色7&#xff09;保存图片 前言 一、数据集 数据下载链接见文章顶部 处理前的数据…

免杀笔记 ----> 后续更新安排

前一段时间&#xff0c;我疯狂更新了内网&#xff0c;本来想把NTLM-Relay给更上的&#xff0c;但是计划安排不允许了&#xff0c;之后后续再给大家进行深入的内网更新了&#xff01;&#xff01; &#xff1a;&#xff1a; 真不是我托更 嘻嘻嘻~~~ 说回正题&#xff0c;接下来…

算法体系-22 第二十二节:暴力递归到动态规划(四)

一 最小距离累加和 1.1 描述 给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角 沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和 返回最小距离累加和 1.2 分析

GitLab教程(六):通过rebase来合并commit

文章目录 1.理解和操作rebase&#xff08;1&#xff09;rebase的逻辑&#xff08;2&#xff09;实践演示 2.rebase的优缺点 1.理解和操作rebase &#xff08;1&#xff09;rebase的逻辑 Git Rebase的基本逻辑是将一个分支的更改移到另一个分支上&#xff0c;同时看起来好像这…

流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗 1.1 数量滚动窗口 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows) 1.1.1 代码分析 Tumbling Count Windows是指按元素个数计数的滚动窗口。 滚动窗口是指没有元素重叠的窗口。 (1)构造了一个KeyedStream&#xff0c;用于存储word_count_data中的数据。…

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了&#xff0c;也能够执行代码了&#xff0c;但是代码错了该如何调试呢&#xff1f;Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序&#xff1a; 但是我们尝试…

汇编:宏的使用

汇编语言中的宏是用于定义可重复使用的代码块或指令集合的强大工具。宏通过简化代码编写和提高可读性&#xff0c;使得编写和维护汇编程序更加方便&#xff1b;在 MASM&#xff08;Microsoft Macro Assembler&#xff09;中&#xff0c;宏的定义和使用非常常见。以下是对汇编语…

java面试题:springMVC的执行流程

请求到达前端控制器DispatcherServlet&#xff0c;该组件是SpringMVC的核心组件&#xff0c;负责接收所有的请求。 DispatcherServlet根据请求中的URL和HandlerMapping找到对应的Controller对象&#xff0c;HandlerMapping是一个接口&#xff0c;定义了请求的URL和对应的Contro…

【linux网络(三)】HTTP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 序列化和…

定个小目标之刷LeetCode热题(16)

针对本题排序流程&#xff0c;主要是将链表拆分为长度为subLength的子链表1和子链表2&#xff0c;然后把子链表1和子链表2合并为一条有序链表&#xff0c;重复上述步骤直到把链表都拆分完&#xff0c;这样这条链表每段长度为2的子链表都是有序的&#xff0c;那么要整条链表有序…