题目
对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像 “Hello World” 一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如 “Hello World” 变形后就变成了 “wORLD hELLO”。
数据范围: 1<=n<10^6 , 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 O(n) , 时间复杂度O(n)
收获
1:虽然这道题最后写完的代码量并不多,很浅显易懂,但是其中的逻辑真的很值得学习~对字符串的整体进行反转的时候,先整体后每一部分,尤其是对每一部分的时候采用for循环的方式并结合while对中间的空格进行截取用i和j分别代表离字符串开始的距离直接进行转换,这种思路可以进行学习
2:就是i=j的部分在循环后期,出循环的时候正好会进行+1转到不是空格的思想
3:学会了对带空格字符串的输入,之前输入一般都是对字符串的数组的输入,遇到空格默认就是下一个字符串,但是这里输入类型只是一个字符串就进行了学习,可以采用getline(cin,str)的方式进行输入可以遇到’\n’再停止输入~,如果是char定义的str[50].就用cin.get(str,n)n代表字符串的个数加一(这里自己有进行测试,如果写对应的个数就会少截取一个字符)
4:即对字符进行大小写转换,如果是大小变小写就-‘A’+‘a’,反之就-‘a’+'A’减去最初的相对值再加上后来变换的相对值,另一种方法就是记住大小写字符串之间的距离,'a’对应的是97,’A’对应的是65,可以进行±32的方法进行转换
5:在使用codeBlock进行调试的时候总遇到闪退的问题,这个在网上查看可能是有中文路径的问题,后期在进行实践的时候在进行更改。
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string trans(string str,int n){
//n代表字符串的长度
if(n==0){
return "";
}
for(int i=0;i<n;i++){
if(str[i]<'Z'&&str[i]>'A'){
str[i]=str[i]-'A'+'a';
}
if(str[i]<'z'&&str[i]>'a'){
str[i]=str[i]-'a'+'A';
}
}
reverse(str.begin(),str.end());
for(int i=0;i<n;i++){
int j=i;
//这里记得空格是字符不是字符串要用单引号~
while(j<n&&str[j]!=' ')
j++;
reverse(str.begin()+i,str.begin()+j);
i=j;
//记住这里再循环的最后i是会向后移动,移动到空格后面的第一个
}
return str;
}
//字符串定义参数方法
//string trans(char str[],11)
/*string trans(string str,int n){
//n代表字符串的长度
if(n==0){
return "";
}
string temp;
for(int i=0;i<n;i++){
if(str[i]<='Z'&&str[i]>='A'){
temp+=str[i]-'A'+'a';
}
else if(str[i]<='z'&&str[i]>='a'){
temp+=str[i]-'a'+'A';
}
else{
temp+=str[i];
}
}
reverse(temp.begin(),temp.end());
for(int i=0;i<n;i++){
int j=i;
//这里记得空格是字符不是字符串要用单引号~
while(j<n&&temp[j]!=' ')
j++;
reverse(temp.begin()+i,temp.begin()+j);
i=j;
//记住这里再循环的最后i是会向后移动,移动到空格后面的第一个
}
return temp;
}*/
int main()
{
string str;
//这里用cin的方法不能像示例一样直接输入一个字符串因为遇到空格会停止输入,所以换种方法,采用getline(cin,str)的方法
getline(cin,str);
//如果是char定义的类型 such as char str[11];就可以使用cin.get(str,11)的方法
//char str[11];
//cin.get(str,12);
//这里的参数12是要比定义的大一?
cout << trans(str,11) << endl;
return 0;
}