题目描述
对于一个长度为 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;
}