LeetCode OJ 之 Reverse Words in a String (翻转字符串的单词)

来源:互联网 发布:源码资本办公地址 编辑:程序博客网 时间:2024/06/05 16:33

题目:

Given an input string, reverse the string word by word.(给定一个输入字符串,按单词翻转这个字符串)

For example,
Given s = "the sky is blue",
return "blue is sky the".

Clarification:

  • What constitutes a word?
    A sequence of non-space characters constitutes a word.(没有空格的连续字符组成了一个单词)
  • Could the input string contain leading or trailing spaces?(字符串的开头和结尾是否可以为空格)
    Yes. However, your reversed string should not contain leading or trailing spaces.(可以,但是翻转后的字符串开头和结尾不能有空格)
  • How about multiple spaces between two words?(如果两个单词直接有多个空格怎么办)
    Reduce them to a single space in the reversed string.(翻转后的字符串空格减少到只有一个)
思路:

把单词存入一个容器中,然后再reverse一下,然后按顺序赋给s即可。(注意当s为空或者s全是空格时,转换后的s为空)

代码:

class Solution {public:    //要考虑到空字符串以及只有空格组成的字符串(注意空和空格字符的区别)    void reverseWords(string &s)     {    vector<string> svec;//存储s的每个单词,不包含空格    //s为空直接返回    if(s.empty())    return;    for(size_t i = 0 ; i < s.size() ; i++)    {        //如果当前字符为空格    if(s[i] == ' ')    continue;    string word;//临时保存当前的单词,在这里定义的好处是下次循环时word初始值又为空了    //开始写成了while(s[i] != ' ' && i < s.size()),一直出现访问越界问题    //因为当i == s.size()时,先访问了s[i]而不是先判断i<s.size(),导致访问越界,这种问题以前还没碰到过,还是写的代码太少了啊    while(i < s.size() && s[i] != ' ')    {    word += s[i];    i++;    }    svec.push_back(word);//把当前单词放入容器    }    reverse(svec.begin(),svec.end());//把单词翻转一下,也可以不翻转,而是按逆序把单词放入s中    //如果svec为空,说明s全为空格,则直接令s为空即可    if(svec.empty())    s = "";    else    {    s.clear();//先清空s    size_t i = 0;    //因为题目要求最后一个字符不能是空格,因此先遍历到倒数第二个单词    for(i = 0 ; i < svec.size()-1 ; i++)    {    s += svec[i];//把当前单词加到s后面    s += ' ';//在s后面再补一个空格    }    s += svec[i];//最后把最后一个单词补上,这样最后一个字符就不是空格了    }    }};




0 0
原创粉丝点击