Leetcode刷题笔记12

HJ1 字符串最后一个单词的长度

字符串最后一个单词的长度_牛客题霸_牛客网

这里可以使用rfind(),rfind()函数从字符串的末尾向前查找第一个空格的位置。这个空格将是最后一个单词和前面的单词的分隔符。首先使用getline读取字符串,然后用rfind找到最后一个空格的位置,最后根据找到的位置,计算最后一个单词的长度并输出。getline 的作用是从标准输入(cin)中读取一行文本,并将其存储到 word 字符串中。getline 读取操作在遇到换行符(\n)时结束,但换行符本身不会被存储到 word 中

代码:C++

#include <iostream>
using namespace std;

int main() {
    
    string str;
    // cin>>str;
    getline(cin,str);
    size_t pos = str.rfind(' ');
    // size是最后一个字符的下一个位置
    // cin输入多个字符串的时候是空格或者换行来间隔的
    // 输入的这一行里面本身就有空格,cin就会认为这个空格是多个值之间的分割
    // 比如hello nowcoder,cin里面就只有hello,nowcoder在缓冲区

    if(pos != string::npos)
    {
        cout<<str.size()-pos-1<<endl;
    }
    // 如果找不到空格,那长度就是size
    else
    {
        cout<<str.size()<<endl;
    }

    return 0;
}

541. 反转字符串 II

541. 反转字符串 II - 力扣(LeetCode)

  • 我们以 2k为一个处理单位,每次对前 k个字符进行反转。具体操作就是每次从第i个字符开始,找到前 k个字符的位置,然后反转这部分字符串。
  • 然后跳过下一个k个字符,继续处理下一个2k段。

下面是几个例子:

 

代码:C++

class Solution {
public:
    string reverseStr(string s, int k) 
    {
        int n = s.size();
        // 每次都是2k个2k个进行处理,所以+=2k
        for(int i=0; i<n; i += 2*k)
        {
            // reverse(s.begin() + i, s.begin() + min(i+k,n));
            // 每隔2k个字符的前k个字符进行反转
            // 剩余字符小于2k个但大于等于k个,则反转前k个字符
            if(i + k <= s.size())
            {
                reverse(s.begin() + i, s.begin() + i + k);
                continue;
            }
            // 剩余字符少于k个,则将剩余字符串全部反转
            reverse(s.begin() + i, s.begin() + s.size());
        }
        return s;
    }
};

557. 反转字符串中的单词 III

557. 反转字符串中的单词 III - 力扣(LeetCode)

解法一:双指针

使用一个 while 循环遍历整个字符串,直到 left 超过字符串长度。
在内部,使用另一个 while 循环找到当前单词的右边界,即找到下一个空格或者字符串的结尾 

  • 遍历字符串

    • 使用两个指针 leftright 来标记每个单词的起始和结束位置。
    • 从头到尾扫描字符串,当遇到空格或字符串末尾时,确定当前单词的范围。
  • 反转每个单词

    • 每找到一个完整的单词时(即从 leftright 之间的字符),使用 C++ STL 的 reverse 函数对该部分字符进行反转。
  • 跳过空格

    • 反转完成后,将 left 更新到下一个单词的起始位置,即跳过当前的空格。
  • 处理边界条件

    • 当遍历到字符串末尾时停止,保证最后一个单词能正确处理,不遗漏任何字符。

代码:C++

class Solution {
public:
    string reverseWords(string s) {
        int left = 0;
        int n = s.size();
        while(left < n)
        {
            // 找到单词右边界
            int right = left;
            while(right < n && s[right] != ' ')
            {
                right++;
            }
            // 反转
            reverse(s.begin() + left, s.begin() + right);

            // 移动left到下一个单词的开头
            left = right + 1;
        }
        return s;

    }
};

125. 验证回文串

125. 验证回文串 - 力扣(LeetCode)

解法一:双指针

  • 忽略非字母数字字符

    • 只需要关心字符串中的字母和数字字符,其余的字符(如标点符号、空格等)可以忽略。因此,需要一个辅助函数 isLetterOrNumber() 来判断当前字符是否是字母或数字。
  • 忽略大小写

    • 不区分大小写的方式是将所有大写字母转换为小写字母。可以通过 ASCII 码的转换来实现(大写字母的 ASCII 值比小写字母小 32)。
  • 双指针法

    • 可以用两个指针,一个从字符串的头部(begin)开始,另一个从尾部(end)开始,向中间移动,逐个字符进行比较。
    • 每次循环中:
      • 如果 begin 指针指向的字符不是字母或数字,则跳过该字符,继续向右移动。
      • 如果 end 指针指向的字符不是字母或数字,则跳过该字符,继续向左移动。
      • 如果 beginend 指针指向的字符都合法,比较它们是否相同。如果不相同,则返回 false,表示字符串不是回文。
      • 如果字符相同,则继续移动指针,直到 begin >= end,表示所有字符都匹配,则字符串是回文。
  • 结束条件

    • beginend 指针相遇或交错时,意味着所有字符已经比较完毕,如果没有发现不相同的字符,则可以判定字符串是回文。

代码:C++

class Solution {
public:
    // 判断是不是字母和数字
    bool isLetterOrNumber(char ch)
    {
        return (ch >= '0' && ch <= '9')
        || (ch >= 'a' && ch <= 'z');
    }
    bool isPalindrome(string s) {

        // 加了引用,所以可以把大写字符转小写
        for(auto& ch : s)
        {
            if(ch >= 'A' && ch <= 'Z')
            {
                ch += 32; // ASCII中,大写字母+32就是对应的小写字母
            }
        }

        int begin = 0, end = s.size()-1;
        while(begin < end)
        {
            while(begin < end && !isLetterOrNumber(s[begin])) // 如果是字母数字就停下来
            {
                // 如果不是字母数字就跳过
                ++begin;
            }
            while(begin < end && !isLetterOrNumber(s[end])) // 如果是字母数字就停下来
            {
                // 如果不是字母数字就跳过
                --end;
            }
            if(s[begin] == s[end])
            {
                // 相等就继续比较
                ++begin;
                --end;
            }
            else
            {
                return false;
            }
        }
        return true;
    }
    
};

 

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

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

相关文章

class 36 二叉树高频题目 - 上 (不含有树形dp)

1. BFS 的两种方式 如下图, 是一个二叉树. 我们需要按照层的方式来遍历这棵树. 1.1 使用 JDK 自带的类实现(链表实现, 经典 BFS) 首先我们实现一个队列, 这个队列从头进, 从尾出.然后将根节点放入其中, 然后将放入的节点弹出,然后继续验证弹出的节点有没有左孩子, 若是有, 将…

便捷之选:微信小程序驱动的停车场管理系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

跨境支付,哪些国产数据库能接得住?

最近有一个非常重大的事件&#xff0c;那就是10月22日-24日的金砖国家会议。金砖国家领导人第十六次会晤是金砖国家进一步凝聚共识、以实际行动推动“全球南方”共同发展进步的重要机遇。 酝酿已久的金砖跨境支付体系&#xff0c;也在这次峰会中正式推出。金砖国家的支付系统一…

国内大语言模型哪家更好用?

大家好&#xff0c;我是袁庭新。 过去一年&#xff0c;AI大语言模型在爆发式增长&#xff0c;呈现百家争鸣之态。国内外相关厂商积极布局&#xff0c;并相继推出自家研发的智能化产品。 我在工作中已习惯借助AI来辅助完成些编码、创作、文生图等任务&#xff0c;甚至对它们产…

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议&#xff0c;接下来我们来接触网络层的协议&#xff1a; 网络层在计算机网络中的意义主要体现…

线段树

文章目录 1 线段树概念2 线段树操作2.1 建树2.2 区间修改2.3 区间查询2.4 练习题目 3 线段树进阶3.1 乘法线段树 * 补充&#xff1a;快读快写4 End 1 线段树概念 线段树 ( S e g m e n t T r e e ) (Segment\ Tree) (Segment Tree) 是 O I OI OI 中的常用算法。线段树是一种…

PHP-FPM 性能配置优化

4 核 8 G 服务器大约可以开启 500 个 PHP-FPM&#xff0c;极限吞吐量在 580 qps &#xff08;Query Per Second 每秒查询数&#xff09;左右。 Nginx php-fpm 是怎么工作的&#xff1f; php-fpm 全称是 PHP FastCGI Process Manager 的简称&#xff0c;从名字可得知&#xff…

基于SSM的冰淇淋在线购买网站【附源码】

基于SSM的冰淇淋在线购买网站 效果如下&#xff1a; 系统首页界面 用户登录界面 冰淇淋页面 每日秒杀页面 个人中心界面 管理员登录界面 管理员功能界面 口味管理界面 冰淇淋管理界面 每日秒杀管理界面 视频教学管理界面 研究背景 近些年&#xff0c;随着中国经济发展&#…

订购 Claude AI 的第二天 它独自完成 文字转语音 flask应用

图二里&#xff0c;删除几个无关的 chats 全程我做的工作&#xff1a;向 AI 提要求&#xff0c;copy / paste 代码&#xff0c;在venv验证运行&#xff0c;向 AI 反馈&#xff0c;总共用了3个 chats.&#xff08;图中的只有一个 Chat&#xff0c; 删掉的另外两个: Python 库安…

海外云手机实现高效的海外社交媒体营销

随着全球化的深入发展&#xff0c;越来越多的中国企业走向国际市场&#xff0c;尤其是B2B外贸企业&#xff0c;海外社交媒体营销已成为其扩大市场的重要手段。在复杂多变的海外市场环境中&#xff0c;如何有效提高营销效率并降低运营风险&#xff0c;成为了众多企业的首要任务。…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

【mysql进阶】4-8 临时表空间

临时表空间 - Temporary Tablespaces 1 什么是临时表&#xff1f; ✅ 解答问题 临时表存储的是临时数据&#xff0c;不能永久的存储数据&#xff0c;⼀般在复杂的查询或计算过程中⽤来存储过渡的中间结果&#xff0c;MySQL在执⾏查询与计算的过程中会⾃动⽣成临时表&#xff0c…

C++ 抛异常

目录 一.抛异常与运行崩溃的区别 1.运行崩溃 2.抛异常 二.抛异常机制存在的意义 1.清晰的处理错误 2.结构化的错误管理 3.跨函数传递错误信息 4.异常对象多态性 三.抛异常的使用方法 1.抛出异常 (throw) 2.捕获异常 (catch) 3.标准异常类 四.抛异常的处理机制 1.抛…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片&#xff0c;flag就在图片上&#xff0c;不过不太明显&#xff0c;写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

rabbitmq 使用注意事项

1&#xff0c;注意开启的端口号&#xff0c;一共四个端口号&#xff0c;1883是mqtt连接的端口号&#xff0c;如果没开&#xff0c;是连接不上的需要手动起mqtt插件。 //开始mqtt插件服务 rabbitmq-plugins enable rabbitmq_mqtt 2&#xff0c;15672端口是http网页登录的管理后…

Next Stack技术联盟成立:打造新一代基础软件技术栈

北京&#xff0c;2024 年 10 月 —— 在全球数字化浪潮的推动下&#xff0c;中国基础软件产业迎来了前所未有的创新机遇与挑战。为应对这一时代任务并推动中国基础软件的全球化进程&#xff0c;观测云携手多家领先技术企业正式宣布成立 Next Stack 技术联盟。这一联盟旨在汇聚国…

接口测试(五)jmeter——get请求

一、get请求——短信验证码&#xff08;示例仅供参考&#xff09; 1. get请求&#xff1a;传参数据直接拼接在地址后面&#xff0c;jmeter不需要设置请求头content-type 注&#xff1a;短信验证码接口&#xff0c;返回结果中不会返回短信验证码&#xff0c;是存在数据库表中&a…

Maven项目管理工具-初始+环境配置

1. Maven的概念 1.1. 什么是Maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 理想的项目构建&#xff1a;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的流程 maven能够自动下载依…

Mybatis-plus-入门

Mybatis-plus-入门 1&#xff1a;介绍 mybatis-plus的官网&#xff1a;MyBatis-Plus &#x1f680; 为简化开发而生 2: 快速入门 步骤&#xff1a; 1&#xff1a;引入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>my…

STM32使用硬件I2C读写AT24C02 EEPROM(一)

文章目录 一、软件准备配置I2C接口&#xff1a;生成工程代码&#xff1a; 二、编写驱动程序初始化I2C接口&#xff1a;编写读写函数&#xff1a; 三、调试与测试 前面讲到使用软件模拟i2c读写AT24C02&#xff0c;这篇文章使用stm32 提供的硬件i2c读写&#xff0c;看看怎么回事 …