代码随想录之字符串刷题总结

news2024/11/8 4:23:37

目录

1.反转字符串

2.反转字符串II

3.替换数字

4.翻转字符串里面的单词

5.右旋&&左旋字符串


1.反转字符串

题目描述:

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

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

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
 输入:["h","e","l","l","o"]
 输出:["o","l","l","e","h"]

示例 2:
 输入:["H","a","n","n","a","h"]
 输出:["h","a","n","n","a","H"]

思路:

使用双指针法

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

注意:

注意i的限定范围

代码:

class Solution {
public:
	void reverseString(vector<char>& s) {
		int start = 0;
		int end = s.size() - 1;
		for (int i = start, j = end; i < s.size()/2; i++, j--) {
			swap(s[i], s[j]);
		}
	}
};

2.反转字符串II

题目描述:

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

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

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

示例:

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

思路:

分成两部分进行处理:

1.每计数到2k个字符,或者剩余字符小于2k但是大于等于k个,就反转前k个字符
2.剩余字符少于k个,反转剩余字符

注意:

reverse接受的是迭代器参数,表示要反转的范围,接受的参数是字符串的起始位置和结束位置

代码:

/*库函数reverse的版本*/
class Solution {
public:
	/*reverse可以写为如下*/
	void reverse(string& s, int start, int end) {//接收数组s,起始元素和终止元素
		for (int i = start, j = end; i < j; i++, j--) {
			swap[s[i], s[j]];
		}
	}
	string reverseStr(string s, int k) {
		for (int i = 0; i < s.size(); i += (2 * k)) {
			//1.每隔2k个字符的前k个字符进行反转
			//2.剩余字符小于2k但是大于或者等于k个,则反转前面k个字符
			/*使用自定义的reverse函数的情况下*/
			if (i + k <= s.size()) {
				reverse(s, i, i + k - 1);
				continue;
			}
			else {
				//剩余字符少于k个,则将剩余字符全部反转
				reverse(s, i, s.size() - 1);
			}
            /*使用系统自带的库函数的情况下*/
            if(i+k<=s.size()){
                reverse(s.begin()+i,s.begin()+i+k);//reverse函数,接受两个迭代器参数,表示要反转的范围,接受的参数是字符串的起始位置和结束位置
            }
            else {
                reverse(s.begin()+i,s.end());
            }
		}
		return s;
	}
};

3.替换数字

题目描述:

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

对于输入字符串 "a5b",函数应该将其转换为 "anumberb"

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

样例输入:a1b2c3

样例输出:anumberbnumbercnumber

数据范围:1 <= s.length < 10000。

思路:
使用双指针法
i指向新长度的末尾,j指向旧长度的末尾
从后往前遍历

先扩充数组
然后再倒序扩充(oldindex,newindex)

注意:

while是关键循环,因为需要一直执行

代码:

int main() {
	string s;
	while (cin >> s) {
		int count = 0;
		int oldindex = s.size() - 1;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] >= '0' && s[i] <= '9') {
				count++;
			}
		}
		s.resize(s.size() + count * 5);
		int newindex = s.size() - 1;
		//关键循环,不断寻找符合条件的数字
		while (oldindex >= 0) {
			if (s[oldindex] >= '0' && s[oldindex] <= '9') {
				s[newindex--] = 'r';
				s[newindex--] = 'e';
				s[newindex--] = 'b';
				s[newindex--] = 'm';
				s[newindex--] = 'u';
				s[newindex--] = 'n';
			}
			//遇到不符合的情况的处理
			else {
				//此处如果写为s[newindex--] = s[oldindex--]
				//会报错,因为会超出oldindex范围
				s[newindex--] = s[oldindex];
			}
			oldindex--;
			
		}
		cout << s << endl;
	}
}

4.翻转字符串里面的单词

题目描述:

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
 输入: "the sky is blue"
 输出: "blue is sky the"

示例 2:
 输入: "  hello world!  "
 输出: "world! hello"
 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
 输入: "a good  example"
 输出: "example good a"
 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路:

- 移除多余空格
- 将整个字符串反转
- 将每个单词反转

注意:

难度较高,条理需要清晰,先去除多余的空,然后再进行翻转处理

代码:

class Solution {
	void Reverse(string& s,int start,int end) {
		for (int i = start, j = end; i < j;i++,j--) {
			swap(s[i],s[j]);
		}
	}

	void removeextra(string& s) {
		int slow = 0;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] != ' ') {
				if (slow != 0) s[slow++] = ' ';
				while (i < s.size() && s[i] != ' ') {
					s[slow++] = s[i++];
				}
			}
		}
		s.resize(slow);
	}

	string fanzhuan(string& s) {
		int start = 0;
		int end = s.size()-1;
		removeextra(s);
		Reverse(s, start,end);
		for (int i = 0; i <= s.size(); i++) {
			if (s[i] == ' ' || i == s.size()) {
				Reverse(s, start, i-1);
				start = i + 1;
			}
		}
		return s;
	}
};

5.右旋&&左旋字符串

题目描述:

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出:输出共一行,为进行了右旋转操作后的字符串。

思路:

先整体翻转

然后前k个翻转

然后后面的翻转

注意:

注意翻转的顺序

reverse接受的是迭代器的参数,要格外注意

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int len = s.size(); //获取长度
    //错误做法
    //reverse是标准库算法,需要传递迭代器参数
    //接受两个参数
    //first:表示要翻转范围的起始位置(包括 first 指向的元素)。
    //last:表示要翻转范围的结束位置(不包括 last 指向的元素,即[first, last)
    /*reverse(start, end);
	reverse(start, start + k - 1);
	reverse(start + k, end);*/
    reverse(s.begin(), s.end()); // 整体反转
    reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
    reverse(s.begin() + n, s.end()); // 再反转后一段

    cout << s << endl;

} 

左旋操作与此类似

int main() {
	string s;
	int n;
	cin >> s;
	cout << "please input n";
	cin >> n;
	reverse(s.begin(), s.begin() + n);
	reverse(s.begin() + n, s.end());
	reverse(s.begin(), s.end());
	cout << "s ==" << s << endl;
}

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

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

相关文章

在Linux系统中高效查找文件所在位置的方法

目录 引言 一、使用find命令查找文件 二、使用locate命令快速查找文件 三、利用which和whereis命令查找可执行文件 四、使用findmnt和mount命令查找挂载点 五、其他查找文件的方法 六、总结与最佳实践 引言 Linux操作系统以其强大的功能和灵活性而闻名&#xff0c;其文件…

连锁餐饮企业-凡塔斯,用千里聆RPA搭建用户评价管理系统,提升门店服务满意度

凡塔斯是大型连锁餐饮企业昊澜餐饮集团旗下餐饮品牌&#xff0c;是牛排自助餐头部品牌&#xff0c;旗下拥有凡塔斯、百分好、食物链KING自助烤肉及餐饮人才商学院等多个行业知名品牌。 创立至今&#xff0c;集团管理门店已发展到福建、广东、江西、浙江等十多个省市&#xff0c…

MES管理系统的生产绩效分析与资源可追踪性

在探讨MES管理系统的核心功能时&#xff0c;生产绩效分析与资源可追踪性是两个不可或缺的关键要素。它们共同构成了MES管理系统中对于生产效率、成本控制以及产品质量进行精细管理的基石。以下是对这两个关键领域的深入剖析与重新阐述。 MES管理系统中的生产绩效分析&#xff0…

远程控制项目第四天 功能实现

发送屏幕内容 代码详解 1. 创建 CImage 对象并获取屏幕内容 首先&#xff0c;我们创建一个 CImage 对象&#xff0c;用于接收屏幕上的内容。要获取屏幕内容&#xff0c;我们需要先获取当前设备上下文&#xff08;DC&#xff09;。调用 ::GetDC(NULL) 函数&#xff0c;参数 NU…

无线领夹麦克风哪个品牌音质最好?无线麦克风品牌排行榜前十名

​无线领夹麦克风哪个品牌音质最好&#xff1f;选择无线麦克风时&#xff0c;音质和耐用性至关重要。近年来&#xff0c;无线麦克风产品越来越智能化和多样化&#xff0c;但也存在着大量的劣质产品。作为测评师&#xff0c;我发现这些低质量无线麦克风由于缺乏专业调校&#xf…

【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】

在 Kubernetes 中&#xff0c;NodePort 类型的 Service 允许用户通过每个节点的 IP 地址和指定的端口访问应用程序。如果 NodePort 类型的 Service 无法通过节点的 IP 地址和指定端口进行访问&#xff0c;可能会导致用户无法访问应用。本文将详细分析该问题的常见原因及其解决方…

并发编程(8)—— std::async、std::future 源码解析

文章目录 八、day81. std::async2. std::future2.1 wait()2.2 get() 八、day8 之前说过&#xff0c;std::async内部的处理逻辑和std::thread相似&#xff0c;而且std::async和std::future有密不可分的联系。今天&#xff0c;通过对std::async和std::future源码进行解析&#x…

在VSCode中读取Markdown文件

在VSCode安装Markdown All in One或Markdown Preview Enhanced即可 插件Markdown All in One GitHub&#xff1a;https://github.com/yzhang-gh/vscode-markdown v3.6.2下载链接&#xff1a;https://marketplace.visualstudio.com/_apis/public/gallery/publishers/yzhang/vs…

成都睿明智科技有限公司共赴抖音电商蓝海

在这个短视频风起云涌的时代&#xff0c;抖音作为现象级的社交媒体平台&#xff0c;不仅改变了人们的娱乐方式&#xff0c;更悄然间重塑了电商行业的格局。在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司凭借其敏锐的市场洞察力和专业的服务能力&#xff0c;…

MySQL_聚合函数分组查询

上篇复习&#xff1a; 设计数据库时的三大范式1.第一范式&#xff0c;一行数据中每一列不可再分 关系型数据库必须要满足第一范式&#xff0c;设计表的时候&#xff0c;如果每一列都可以用SQL规定的数据类型描述&#xff0c;就天然满足第一范式. 2.第二范式&#xff0c;在第一…

深入了解逻辑回归:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

TESSY学习笔记—project view界面的架构

1&#xff1a;project view界面能添加的元素 project view界面能添加的元素&#xff08;暂且称为元素&#xff09;&#xff0c;打开project view界面&#xff0c;下图中红框勾选出来的就是 2&#xff1a;一共存在5种可添加元素 **1&#xff09;Test collection 测试集合&…

distrobox install in ubuntu 22.04 / 在 ubuntu 22.04 上安装 distrobox (***) OK

要点&#xff1a; 本测试实验&#xff0c;采用的是 podman distrobox 在沙盒 snap 中&#xff0c;安装 distrobox 需要使用 --devmode 开发模式&#xff1b;可以避开 distrobox 的版本检查&#xff1f; distrobox 官方文档显示&#xff0c; Installation https://distrobox.i…

跨域及解决跨域

什么是跨域 前端与后端不在同一个域名下&#xff1a; 解决 import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component;import java.io.IOException…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

【读书笔记/深入理解K8S】集群网络

前言 上一章讲了集群控制器的一个大概的原理&#xff0c;这一章讲一下集群网络。网络是集群通信的载体&#xff0c;因为该书是阿里云团队出品的&#xff0c;所以也以阿里云的集群网络方案为例&#xff0c;其他云厂商的网络集群方案一般来说也大同小异。所以通过本章的学习&…

Varjo核电厂虚拟仿真培训解决方案

虚拟现实技术的融入将帮助核电厂设计验证和操作员培训跟有效的进行。 芬兰的Loviisa工厂是世界上第一个为控制室操作员建造专用VR培训室的核电站。该工厂使用了Varjo混合现实头显设备为员工提供虚拟仿真训练。 案例Fortum: VR为核电厂操纵员培训带来明显优势 与构建物理模拟器相…

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象&#xff0c;使园林规划变得简单直观。此外&#xff0c;Garden Planner提供工具来快速创建铺路、路径和围栏&#xff0c;帮助用户设计…

HTML 标签属性——id、class、style 等全局属性详解

文章目录 1. id属性2. class属性3. style属性4. title属性5. lang属性6. dir属性7. accesskey属性8. tabindex属性小结HTML全局属性是一组可以应用于几乎所有HTML元素的特殊属性。这些属性提供了额外的功能和信息,使得网页开发者能够更好地控制元素的行为、样式和可访问性。 …

SpringBoot 整合达梦数据库 Demo

本文将介绍如何在 Spring Boot 项目中整合达梦数据库&#xff0c;并实现基本的用户管理功能。通过以下步骤&#xff0c;我们将创建一个简单的 RESTful API&#xff0c;以便于用户的增删改查&#xff08;CRUD&#xff09;操作。 【点我: 下载整套源码】 1. 创建数据库与数据表 …