调换单词顺序,并进行大小写转换.
#include <bits/stdc++.h>
#include <regex>
using namespace std;
void removespace(string& s){
if(s[0])
// 使用正则表达式匹配多个连续的空格,并替换为一个空格
regex pattern("\\s+");
//想要在字符串中表示一个反斜杠字符本身时,你需要使用两个反斜杠 \\
//在正则表达式中,\s+代表匹配一个或多个连续的空白字符。
string result = regex_replace(s, pattern, " ");
//将str字符串中等于pattern的字符替换成一个空格
s=result;//将修改后的字符串赋给s
}
void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void change(string& s){
int a=0;
for(int i=0;i<s.size();i++){
a=s[i];
if(a>64&&a<91){//小写字母范围65-90
a+=32;//变为大写
s[i]=a;
}
else if(a<123&&a>96){//大写字母范围97-122
a-=32;//变为小写
s[i]=a;
}
}
}
int main(){
string s={" wORLD hELLO hI "};
removespace(s);
reverse(s,0,s.size()-1);//进行第一次反转
change(s);//转换为小写
int start=0;//单词词首元素
for(int i=0;i<s.size();i++){
if(s[i]==' '){//如果碰到空格,说明当前单词结束
reverse(s,start,i-1);
start=i+1;
}
else if(i==s.size()-1){//如果是最后一个字母
reverse(s,start,i);
}
}
for(int i=0;i<s.size();i++){
cout<<s[i];
}
return 0;
}
输入:
输出:
************************************************************
可参考:
class Solution {
public:
//本题先将字符串中多余的空格去除,然后将整个字符串反转,最后将每个单词单独反转
string removespace(string s)//将多余空格删除
{
int slow=0;
for(int fast=0;fast<s.size();fast++)
{
if(s[fast]!=' ')//如果没有遇到空格
{
if(slow!=0){//手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
s[slow++]=' ';
}
while(fast<s.size()&&s[fast]!=' '){//不是空格的话快慢指针一起动,将s[fast]的元素都赋给s[slow]
s[slow++]=s[fast++];
}
}
}
s.resize(slow);//重新定义字符串大小
return s;
}
string reverseWords(string s)
{
s=removespace(s);
reverse(s.begin(),s.end());
int start=0;
for(int i=0;i<=s.size();i++)//注意边界
{
if(s[i]==' '||i==s.size())
//分别是i遍历到最后一个字母以及i遍历到每个单词最后一个字母时
{
reverse(s.begin()+start,s.begin()+i);//翻转此单词
start=i+1;//start的位置从i的下一个开始
}
}
return s;
}
};