持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
一、题目
描述
对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。
保证给定的字符串均由大小写字母和空格构成。
#include <iostream>
using namespace std;
string Inversion(string str)
{
}
int main(int, char*[])
{
string str = "This is a sample";
cout << Inversion(str) << endl;
}
二、分析
由题意可知,这道题有两个处理,一个是将字母大小写反转,一个是按单词顺序反转。
大小写反转比较简单,小写字母减去32,大写字母加上32就可以了。
按单词顺序反转就比较难了,首先要保证单词本身的顺序,那就不能直接遍历字符串,而需要先把单词完整的拿出来,再去遍历单词列表实现反转。
单词的分割就很简单了,通过不断的获取空格来获取单词,然后把单词通过链表串起来,获取完了之后再遍历链表即可。
三、模拟
- T
- Th
- Thi
- This
- This_ 检测到空格,分割到单词This
- i
- is
- is_ 检测到空格,分割到单词is
- a
- a_ 检测到空格,分割到单词a
- s
- sa
- sam
- samp
- samp
- sampl
- sample 遍历结束,将最后一个单词sample放到链表
四、实现
string Inversion(string str)
{
string result;
list<string> ss;
string temp;
for(auto iter = str.begin(); iter != str.end(); ++iter){
if(*iter == ' '){
ss.push_front(temp);
temp.clear();
}else if(*iter < 'a'){
temp.push_back(*iter + 32);
}else{
temp.push_back(*iter - 32);
}
}
if(!temp.empty()){
ss.push_front(temp);
}
for(auto iter = ss.begin(); iter != ss.end(); ++iter){
if(!result.empty()){
result.push_back(' ');
}
result.append(*iter);
}
return result;
}
五、结言
这道题稍微有点简单,但是也需要一定的思考。
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!