剑指 Offer 58-I 翻转单词顺序C++


2020/2/5 二刷
substr(字符串,截取开始位置,截取长度)


题目描述

在这里插入图片描述

解法 istringstream

istringstream方法.

class Solution {
    
    
public:
    string reverseWords(string s) {
    
    
        if(s.size() == 0) return "";
        stack <string> stk;
        string tem, ans;
        istringstream ss(s);
        while(ss >> tem) {
    
    
            stk.push(tem);
            stk.push(" ");
        }
        if(!stk.empty()) stk.pop();
        while(!stk.empty()) {
    
    
            ans += stk.top();
            stk.pop();
        }
        return ans;
    }
};

很明显这里利用堆栈把所有字母倒过来了,然后去掉多出来的一个空格,由于去掉栈首比较方便,我们先push字符串再push空格。
时间复杂度和空间复杂度都不太懂,插个眼改日研究。
这里其实不用堆栈也能做
每次都把字母塞到前面,最后去掉第一次多出来的空格就行。

class Solution {
    
    
public:
    string reverseWords(string s) {
    
    
        string tem, ans;
        istringstream ss(s);
        while(ss >> tem) {
    
    
            ans = tem + ' ' + ans;
        }
        return ans.substr(0, ans.size() - 1);
    }
};

第二个空间复杂度好像高很多
在这里插入图片描述
在这里插入图片描述
可能是使用substr的问题,于是改成 ans . pop_back试试。

解法 双指针法

总所周知,这种题目肯定可以双指针
j从最后一个下标开始,找到一个不为空格的字符,就定义一个i从j - 1开始往前找,直到找到空格为止,将此间的字符放入答案。然后让j = i ,继续往前寻找。
ps:要注意最后一个字符前没有空格,这时候i到0就必须停止。

class Solution {
    
    
public:
    string reverseWords(string s) {
    
    
        if(s.size() == 0) return "";
        int j = s.size() - 1;
        string ans;
        for(;j >= 0; --j) {
    
    
            //跳过空格
            if(s[j] == ' ') continue;
            int i = j - 1;
            while(i >= 0 && s[i] != ' ') i--;
            //i + 1 到 j组成一个单词
            for(int k = i + 1; k <= j; k ++) ans.push_back(s[k]);
            //push_back添加一个字符
            ans.push_back(' ');
            j = i;
        }
        if(s.size() > 0) return ans.substr(0, ans.size() - 1);
        return "";
    }
};

时间复杂度O(N)
空间复杂度O(N)

猜你喜欢

转载自blog.csdn.net/qq_42883222/article/details/112643558