美文网首页数据结构&算法&人工智能
剑指offer编程题—翻转单词序列

剑指offer编程题—翻转单词序列

作者: 零岁的我 | 来源:发表于2020-05-11 14:50 被阅读0次

题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

解题思路
分析题意,本质上就是完成字符串的反转,只不过这里不是以单个字符为单位进行反转,而是以空格为分隔符划分单词,最后以单词为单位翻转字符串。
例如:给定字符串“student. a am I”,以空格为分隔符划分得到单词序列为:"student."、"a"、"am"、"I",对单词序列进行翻转操作后有:“I am a student.”
注意细节:翻转后的字符串首尾不能有空格,如果给定字符串全部是空格,则直接返回原字符串。
明白了题意,这题就很简单了,可以使用辅助空间完成反转,例如栈,将每一个单词顺序进栈,最后出栈,就是完成了反转,比较简单,这里不再进行实现。
下面复习一下C++库函数istringstream和ostringstream,这两个函数都包含在头文件sstream中。
istringstream是对字符串进行操作的输入流类。该类的对象使用一个包含字符序列的字符串缓冲区。这个字符序列可以作为一个字符串对象直接访问,其构造函数原型如下:

istringstream::istringstream(string str);

它的作用是从 string 对象 str 中读取字符。

class Solution {
public:
    string ReverseSentence(string str) {
        if(str.empty()) return str; 
        int i=0,len=str.length();
        while(i<len && str[i] == ' ') ++i;
        if(i==len) return str; //如果给定字符串全部是空格,则直接返回
        istringstream ss(str);
        stack<string> st;
        string temp;
        while(ss>>temp){
            st.push(temp);
        }
        ostringstream res;
        while(!st.empty()){
            res<<st.top()<<' ';
            st.pop();
        }
        return res.str().substr(0,len); //去掉最后的空格
    }
};

基于以上思路,自己实现拆分单词的操作

class Solution1{
public:
    string ReverseSentence(string str) {
        if(str.empty()) return str;
        int i=0,len=str.length();
        while(i<len && str[i] == ' ') ++i;
        if(i==len) return str;
        string res="";
        string word=" ";
        i=0;
        while(i<len){
            if(str[i] != ' '){
                word += str[i];
            }
            else{
                res = word+res;
                word=" ";
            }
            ++i;
        }
        res = word.substr(1)+res;
        return res.substr(0,len); //去除最后的一个空格
    }
};

相关文章

网友评论

    本文标题:剑指offer编程题—翻转单词序列

    本文链接:https://www.haomeiwen.com/subject/vtjunhtx.html