字符串变形 C++

2023-07-30 10:35:02 浏览数 (1)

题目描述

对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

数据范围: 1le n le 10^61≤n≤106 , 字符串中包括大写英文字母、小写英文字母、空格。

进阶:空间复杂度 O(n)O(n) , 时间复杂度 O(n)O(n)

输入描述:

给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)

返回值描述:

请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。

思路分析

要看清楚题目说的是将单个单词里面的字母顺序,而不是将这个字符串里面的单词的顺序颠倒。

因为C 的算法库里面有reverse函数,它的作用就是将整个字符串的字符顺序颠倒过来,所以我的思路比较大众化,为将单词里面的字母顺序颠倒,首先用reverse函数将整个字符串的字符顺序颠倒,然后,用空格作为字符串划分单词的判断点,对每一个由空格隔开的部分(即单词)再次使用reverse函数颠倒。

为了方便,我尽可能地调用库函数,像判断字母大小写,字符串的长度之类的。

我里面还用到了auto变量,auto变量属实好用。

AC代码

代码语言:javascript复制
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
	string s;
	int n,i,j;
	getline(cin,s);
	cin>>n;
	for(auto& element:s){
		if(isupper(element))
		element =32;
		else if(islower(element))
		element-=32;
	}
	reverse(s.begin(),s.end());
	for(i=0;i<n;i  ){
		for(j=i;j<n;j  )
		if(s[j]==' ')
		break;
		reverse(s.begin() i,s.begin() j);
		i=j;
	}
	cout<<s;
}

0 人点赞