算法刷题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

相关文章

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.