每日一算法题-字符串反转

151 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一、题目

描述
对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。
保证给定的字符串均由大小写字母和空格构成。

image.png

#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就可以了。
按单词顺序反转就比较难了,首先要保证单词本身的顺序,那就不能直接遍历字符串,而需要先把单词完整的拿出来,再去遍历单词列表实现反转。
单词的分割就很简单了,通过不断的获取空格来获取单词,然后把单词通过链表串起来,获取完了之后再遍历链表即可。

三、模拟

  1. T
  2. Th
  3. Thi
  4. This
  5. This_ 检测到空格,分割到单词This
  6. i
  7. is
  8. is_ 检测到空格,分割到单词is
  9. a
  10. a_ 检测到空格,分割到单词a
  11. s
  12. sa
  13. sam
  14. samp
  15. samp
  16. sampl
  17. 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;
}

五、结言

这道题稍微有点简单,但是也需要一定的思考。

创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!