算法刷题Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

本文主要是介绍算法刷题Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 0 引言
  • 1 反转字符串
    • 1.1 我的解题
    • 1.2
  • 2 反转字符串II
    • 2.1 解题
  • 3 替换数字
    • 3.1 双指针法
  • 4 翻转字符串里的单词
    • 4.1 我的解题思路
    • 4.2 另一种思路
  • 5 右旋转字符串
    • 5.1
    • 5.2

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:算法刷题Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

0 引言

1 反转字符串

  • 🎈 文档讲解:
  • 🎈 视频讲解:
  • 🎈 做题状态:确实很简答

1.1 我的解题

只要找到翻转的时候是对称的就很简单了。

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

1.2

2 反转字符串II

  • 🎈 文档讲解:
  • 🎈 视频讲解:
  • 🎈 做题状态:可以做出来,但是对string的reverse函数不熟练

2.1 解题

string str = "abcdefg";
reverse(str.begin(), str.begin() + 2);

在 C++ 中,reverse() 函数用于反转指定范围内的元素。在 reverse(str.begin(), str.begin() + 2) 中,它将反转从 str.begin()str.begin() + 2(不包括 str.begin() + 2)的范围内的元素。

因此,给定字符串 “abcdefg”,在执行 reverse(str.begin(), str.begin() + 2) 后,索引 0 和 1 的元素 “a” 和 “b” 会被交换位置,而索引 2 的元素 “c” 不会被改变。因此结果为 “bacdefg”。


将所有每次都加2k,然后改变前k个数。这样就不需要进行切换操作了,想法很妙。

class Solution {
public:string reverseStr(string s, int k) {for (int i = 0; i < s.size(); i += (2 * k)) {// 1. 每隔 2k 个字符的前 k 个字符进行反转// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符if (i + k <= s.size()) {reverse(s.begin() + i, s.begin() + i + k );} else {// 3. 剩余字符少于 k 个,则将剩余字符全部反转。reverse(s.begin() + i, s.end());}}return s;}
};

3 替换数字

  • 🎈 文档讲解:
  • 🎈 视频讲解:
  • 🎈 做题状态:使用额外的数组的话很简单,要不就用双指针

3.1 双指针法

在不开辟额外空间的情况下使用双指针法,从后向前遍历。
使用resize函数扩充容器大小。

#include<iostream>
using namespace std;
int main() {string s;while (cin >> s) {int count = 0; // 统计数字的个数int sOldSize = s.size();for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9') {count++;}}// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小s.resize(s.size() + count * 5);int sNewSize = s.size();// 从后先前将空格替换为"number"for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {if (s[j] > '9' || s[j] < '0') {s[i] = s[j];} else {s[i] = 'r';s[i - 1] = 'e';s[i - 2] = 'b';s[i - 3] = 'm';s[i - 4] = 'u';s[i - 5] = 'n';i -= 5;}}cout << s << endl;}
}

4 翻转字符串里的单词

  • 🎈 文档讲解:
  • 🎈 视频讲解:
  • 🎈 做题状态:有思路,但是很难写

4.1 我的解题思路

思路:

  1. 使用 vector<string> 保存划分后的string 数组。(双指针划分数组)
  2. 然后将这个 vector<string> 给翻转。(翻转数组这个简单)
  3. 最后将vector<string>遍历得到一个 string。

4.2 另一种思路

  1. 先将多余的空格去掉(双指针),遇到字符就先插入一个空格,然后循环添加后面非空格字符,然后再继续遇到非空格字符,就再插入一个空格。这样可以保证每个新插入的单词前都有一个空格。要注意的是第一个单词前没有空格。
  2. 然后翻转整体字符串(这个之前题目就做过,直接用库函数就行)
  3. 最后将单词内部再翻转一次(同2,前提是使用双指针判断是一个单词范围内)
class Solution {
public:void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。int slow = 0;   //整体思想参考https://programmercarl.com/0027.移除元素.htmlfor (int i = 0; i < s.size(); ++i) { //if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。s[slow++] = s[i++];}}}s.resize(slow); //slow的大小即为去除多余空格后的大小。}string reverseWords(string s) {removeExtraSpaces(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。reverse(s, 0, s.size() - 1);int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。start = i + 1; //更新下一个单词的开始下标start}}return s;}
};

5 右旋转字符串

  • 🎈 文档讲解:
  • 🎈 视频讲解:
  • 🎈 做题状态:

5.1

5.2

这篇关于算法刷题Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808737

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1