从C语言到C++_12(string相关OJ题)

news2025/1/10 23:20:34

上一篇已经讲了string类的接口函数,然后根据查文档刷了一道力扣415字符串相加,

这篇继续跟着查文档来刷力扣题,体会C++刷题的方便。

目录

917. 仅仅反转字母 - 力扣(LeetCode)

代码解析:

387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

解析代码:

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

代码解析:

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

解析代码:

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

解析代码:

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

解析代码:

43. 字符串相乘 - 力扣(LeetCode)

解析代码:

本章完。


917. 仅仅反转字母 - 力扣(LeetCode)

难度简单

给你一个字符串 s ,根据下述规则反转字符串:

  • 所有非英文字母保留在原有位置。

  • 所有英文字母(小写或大写)位置反转。

返回反转后的 s 。

示例 1:

输入:s = "ab-cd"
输出:"dc-ba"

示例 2:

输入:s = "a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

示例 3:

输入:s = "Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

提示

  • 1 <= s.length <= 100

  • s 仅由 ASCII 值在范围 [33, 122] 的字符组成

  • s 不含 '\"' 或 '\\'

class Solution {
public:
    string reverseOnlyLetters(string s) {

    }
};

代码解析:

这道题和快排的思路很类似,swap不知道有没有讲过在algorithm这个头文件里有,和我们在函数模板实现的差不多,这种常用的肯定能想起来了,像判断是不是字母等函数,想不起来可以自己写,想起来不清楚可以查文档:

class Solution {
public:
    string reverseOnlyLetters(string s) {
        int left  = 0,right = s.size() - 1;
        while(left < right)
        {
            while(left < right && !isalpha(s[left]))// 找字母,注意越界
            {
                ++left;
            }
            while(left < right && !isalpha(s[right]))
            {
                --right;
            }
            swap(s[left++],s[right--]);// 交换后往中间走,传引用,
        }
        return s;
    }
};

387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

难度简单

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例 1:

输入: s = "leetcode"
输出: 0
示例 2:

输入: s = "loveleetcode"
输出: 2
示例 3:

输入: s = "aabb"
输出: -1

提示:

1 <= s.length <= 10^5
s 只包含小写字母

class Solution {
public:
    int firstUniqChar(string s) {
        
    }
};

解析代码:

可以暴力查找,是O(N^2),只有小写字母,可以用计数排序的思想:

class Solution {
public:
	int firstUniqChar(string s) {
		int countArr[26] = { 0 };
		for (auto e : s)
		{
			countArr[e-'a']++;//相对映射到数组里++
		}
		for (int i = 0;i < s.size(); i++)
		{
			if (countArr[(s[i]-'a')] == 1)//从原字符串遍历字符的相对映射
			{
				return i;//第一个相对映射为1的就返回其下标
			}
		}
		return -1;//没有出现一次的,输出-1
	}
};

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

难度简单

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

提示:

  • 1 <= s.length <= 2 * 10^5

  • s 仅由可打印的 ASCII 字符组成

class Solution {
public:
    bool isPalindrome(string s) {

    }
};

代码解析:

 此题和快排思路类似,从两边找字符,判断是否相等,这题可能刚看会有其它思路,但把全部大写字母转成小写字母,或者反过来都是很方便的,动手动手:

 

class Solution {
public:
    bool isPalindrome(string s) {
        for(auto& e : s)
        {
            e = tolower(e);// 如果是大写就转小写,不是大写就不处理
        }
        int left = 0,right = s.size() - 1;
        while(left < right )//找字母数字字符后比较
        {
            while(left < right && !isalpha(s[left]) && !isdigit(s[left]))
            {
                left++;
            }
            while(left < right && !isalpha(s[right]) && !isdigit(s[right]))
            {
                right--;
            }
            if(s[left] != s[right])
            {
                return false;
            }
            else
            {
                left++;
                right--;
            }
        }
        return true;
    }
};

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

难度简单

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,

你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 10^5

  • s[i] 都是 ASCII 码表中的可打印字符

class Solution {
public:
    void reverseString(vector<char>& s) {

    }
};

解析代码:

可以说我们以前都实现过了,就是这里变成了vector,

这里的vector就是一个存char类型的数组,我们收尾交换,进行翻转:

class Solution {
public:
    void reverseString(vector<char>& s) {
        int left = 0,right = s.size() - 1;
        while(left < right)
        {
            swap(s[left++],s[right--]);
        }
    }
};

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

难度简单

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,

就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。

  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 10^4

  • s 仅由小写英文组成

  • 1 <= k <= 10^4

class Solution {
public:
    string reverseStr(string s, int k) {

    }
};

解析代码:

题目确实有点难懂,人话:每隔k个反转k个,末尾不够k个时全部反转。

一顿试错后的代码:

class Solution {
public:
    void reverseString(string& s,int left,int right) {
        while(left < right)
        {
            swap(s[left++],s[right--]);
        }
    }
    string reverseStr(string s, int k) {
        for(size_t i = 0; i < s.size(); i += 2*k)
        {
            if(i + k > s.size())
            {
                reverseString(s,i,s.size() - 1);
            }
            else
            {
                reverseString(s,i,i + k - 1);
            }
        }
        return s;
    }
};

还可以用官方库里面的左闭右开(上面实现的是左闭右闭)的reverse函数:

class Solution {
public:
    void reverseString(string& s,int left,int right) {
        while(left < right)
        {
            swap(s[left++],s[right--]);
        }
    }
    string reverseStr(string s, int k) {
        for(size_t i = 0; i < s.size(); i += 2*k)
        {
            if(i + k > s.size())
            {
                //reverseString(s,i,s.size() - 1);
                reverse(&s[i],&s[s.size()]);
            }
            else
            {
                //reverseString(s,i,i + k - 1);
                reverse(&s[i],&s[i + k]);
            }
        }
        return s;
    }
};

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

难度简单

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,

同时仍保留空格和单词的初始顺序。

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "God Ding"
输出:"doG gniD"

提示:

  • 1 <= s.length <= 5 * 10^4

  • s 包含可打印的 ASCII 字符。

  • s 不包含任何开头或结尾空格。

  • s 里 至少 有一个词。

  • s 中的所有单词都用一个空格隔开。

class Solution {
public:
    string reverseWords(string s) {

    }
};

解析代码:

(类似双指针的思想:)

class Solution {
public:
    string reverseWords(string s) {
        size_t left = 0,right = 0;
        while(left < s.size())
        {
            while(right < s.size() && s[right] != ' ')// 找空格/结尾,要先判断结尾,防止越界访问
            {
                ++right;
            }
            reverse(&s[left],&s[right]);// 注意是左闭右开(反正我是服了)
            ++right;//跳过空格,进行下一次判断
            left = right;
        }
        return s;
    }
};

43. 字符串相乘 - 力扣(LeetCode)

难度中等

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,

它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200

  • num1 和 num2 只能由数字组成。

  • num1 和 num2 都不包含任何前导零,除了数字0本身。

class Solution {
public:
    string multiply(string num1, string num2) {

    }
};

解析代码:

class Solution {
public:
    string multiply(string num1, string num2) {

    }
};

本章完。

下一篇:模拟实现string,深拷贝浅拷贝,拷贝构造和赋值重载的传统写法和现代写法。

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

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

相关文章

SSRS rdlc报表 一 创建报表

环境 vs2019 fromwork4.5 第一步 安装rdlc报表插件 vs2019使用rdlc&#xff0c;需要安装扩展插件&#xff0c;扩展→扩展管理→联机&#xff0c;搜索rdlc&#xff0c;安装Microsoft RDLC Report Designer&#xff0c;我在安装过程中&#xff0c;安装了很久都没安装成功&…

构建高可用性的核心服务层:Coupang电子商务应用程序的技术实践

随着Coupang电子商务平台用户数量的快速增长&#xff0c;构建一个高可用性的核心服务层成为了关键任务。本文将介绍Coupang如何通过统一的NoSQL数据存储、缓存层和实时数据流等技术和策略&#xff0c;构建一个高可用性的核心服务层&#xff0c;以满足日益增长的数据流量需求&am…

保姆式教学--教室友从买服务器到怎么搭建内网隧道

本文转载于&#xff1a;https://blog.csdn.net/qq_39739740/article/details/127604642 一、购买云服务器 怎么购买&#xff1f; 三个主流厂商&#xff1a;华为云、腾讯云、阿里云 --------拿阿里云举例。 首先第一步、我们要百度搜索 阿里云→进入官网→选择最便宜的服务器&…

python+django音乐推荐网站vue

为此开发了本音乐推介网站 &#xff0c;为用户提供一个基于音乐推介网站&#xff0c;同时方便管理员&#xff1b;首页、个人中心、用户管理&#xff0c;类型信息管理、乐器类型管理、歌曲信息管理、戏曲信息管理、MV专区管理、付费音乐管理、订单信息管理、音乐文件管理、论坛管…

JavaSE基础(七)—— 常用API(String、 ArrayList)

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需…

阿里云/dev/vda1磁盘空间占满的解决过程

1.查看文件系统系统的占有量 使用df -h查看了下 2.查看本目录占据多少磁盘空间 du -sh 3.在cd /目录下 du -sh查看各个目录占据多少空间 d 然后使用 du -sh *查看具体文件差距多少空间逐一排查最后把占据大的文件删除掉即可.

Elasticsearch:使用字节大小的向量节省空间 - 8.6

作者&#xff1a;Jack Conradson, Benjamin Trent Elasticsearch 在 8.6 中引入了一种新型向量&#xff01; 该向量具有 8 位整数维度&#xff0c;其中每个维度的范围为 [-128, 127]。 这比具有 32 位浮点维度的当前向量小 4 倍&#xff0c;这可以节省大量空间。 你现在可以通…

【哈士奇赠书活动 - 24期】-〖前端工程化:基于Vue.js 3.0的设计与实践〗

文章目录 ⭐️ 赠书 - 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》⭐️ 内容简介⭐️ 作者简介⭐️ 精彩书评⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》 ⭐️ 内容简介 本书以Vue.js的3.0版本为核心技术栈&#…

Python自动化办公对每个子文件夹的Excel表加个表头(Excel不同名)(下篇)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 昭阳殿里恩爱绝&#xff0c;蓬莱宫中日月长。 大家好&#xff0c;我是皮皮。 一、前言 上一篇文章&#xff0c;我们抛出了一个问题&#xff0c;这篇文章…

发挥CWPP在零售行业安全关键价值

新钛云服已累计为您分享747篇技术干货 CWPP产品对于零售行业安全有关键价值&#xff0c;可以极大提升零售行业安全水平&#xff0c;是零售行业必备的安全产品。 零售行业的特点 零售行业的特点是实时在线、数据有独特价值&#xff0c;安全挑战是缺乏安全投入和人员。 实时在线方…

推荐 5 月份炫炫炫的 GitHub 项目

推荐 6 个五月份比较火的开源项目。因为近期 AI 项目的火爆&#xff0c;每天 GitHub 热榜都被 AI 项目占据&#xff0c;后续开源项目会同时盘点 AI 和其他分类的开源项目。 本期推荐开源项目目录&#xff1a; 1. 多合一聊天机器人客户端&#xff08;AI&#xff09; 2. 数据库场…

蓝库云|生产报工系统对制造业的作用,能给企业带来的质的飞跃

生产报工系统&#xff0c;对于做制造业的企业来说是再熟悉不过的软件系统了&#xff0c;不仅可以令制造企业可以快速响应客户需求&#xff0c;根据客户订购要求进行生产计划管理&#xff0c;还能生产报工可以帮助制造企业提升生产效率、提高产品质量、改善生产计划和提高客户满…

企业级应用如何用 Apache DolphinScheduler 有针对性地进行告警插件开发?

点击蓝字 关注我们 作者 | 刘宇星 Apache DolphinScheduler的2.0.1版本加入了插件化架构改进&#xff0c;将任务、告警组件、数据源、资源存储、注册中心等都将被设计为扩展点&#xff0c;以此来提高 Apache DolphinScheduler 本身的灵活性和友好性。在企业级应用中不同公司的告…

ChatGPT被广泛应用,潜在的法律风险有哪些?

ChatGPT由OpenAI开发&#xff0c;2022年11月一经面世便引发热烈讨论&#xff0c;用户数持续暴涨。2023年初&#xff0c;微软成功将ChatGPT接入其搜索引擎Bing中&#xff0c;市场影响力迅速提升&#xff0c;几乎同一时间&#xff0c;谷歌宣布其研发的一款类似人工智能应用Bard上…

树莓派 Ubuntu 18.04 连接 WiFi

树莓派 Ubuntu 18.04 连接 WiFi 阿瑞特后视镜那边代码调试需要用到树莓派&#xff0c;但是实验室 TP-LINK-DD48 用不了 所以要更改原先的 WiFi 连接信息 树莓派raspberry Pi 4B安装Ubuntu 20.04 LTS系统后如何连接WiFi 树莓派4B(ubuntu)设置wifi的方法 树莓派4B安装Ubuntu Se…

函数式接口入门简介(存在疑问,求解答)

这里写目录标题 引子四种函数式接口-简单Demo四种函数式接口介绍函数式接口实战-代码对比关于Consumer赋值问题&#xff08;疑问&#xff0c;求解答&#xff09; 引子 只包含一个抽象方法的接口&#xff0c;就称为函数式接口。来源&#xff1a;java.util.function 我想在方法…

【JS】1691- 重学 JavaScript API - Performance API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API ❞ &#x1f3dd; 1. 什么是 Performance API 1.1 概念介绍 Performance API 提供了「访问和测量浏览器性能相关信息」的方法。…

作为IT行业过来人,我有4个重要建议给年轻程序员!

见字如面&#xff0c;我是军哥&#xff01; 作为一名 40 岁的 IT 老兵&#xff0c;我在年轻时踩了不少坑&#xff0c;至少有两打&#xff0c;我总结了其中最重要的 4 个并一次性分享给你&#xff0c;文章不长&#xff0c;你一定要看完哈&#xff5e; 1、重视基础还不够&#xf…

OpenAI Whisper + FFmpeg + TTS:动态实现跨语言视频音频翻译

本文作者系360奇舞团前端开发工程师 摘要&#xff1a; 本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS&#xff08;Text-to-Speech&#xff09;技术&#xff0c;以实现将视频翻译为其他语言并更换声音的过程。我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译&#x…

软件设计师 操作系统涉及题目

做题技巧 看有几个箭头就是有几个信号量。比如四个箭头就是S1 S2 S3 4把对应的信号量从小到大顺序放在对应箭头 比如P1-》P2就是 12 P1-》P3就是13 所以13大 注意是先V(S) 再P(S)&#xff0c;箭头前是v后是p **P1没有前驱&#xff0c;第一个执行的进程.执行前用P操作 执行后用…