剑指offer——面试题42-2:翻转单词顺序

力扣

Python

class Solution:
    def reverseMessage(self, message: str) -> str:
        origin_arr = message.split(' ')
        valid_arr = []
        for item in origin_arr:
            if len(item) > 0:
                valid_arr.append(item)

        valid_arr.reverse()
        return ' '.join(valid_arr)

Java

class Solution {
    public String reverseMessage(String message) {
        String newStr = message.trim();
        List<String> strArray = new ArrayList<>();
        int i = 0;
        while (i < newStr.length()) {
            if (newStr.charAt(i) == ' ') {
                ++i;
            } else {
                int j = i + 1;
                while (j < newStr.length() && newStr.charAt(j) != ' ') {
                    ++j;
                }
                strArray.add(newStr.substring(i, j));
                i = j;
            }
        }

        StringBuilder s = new StringBuilder();
        for (i = strArray.size() - 1; i > 0; --i) {
            s.append(strArray.get(i));
            s.append(" ");
        }
        if (strArray.size() > 0) {
            s.append(strArray.get(0));
        }

        return s.toString();
    }
}

20180906整理
##Solution1:
自己想的垃圾算法
对于c++中的string对象,substr()和erase()函数都是很常用的,常见用法必须熟练掌握!

class Solution {
public:
    string ReverseSentence(string str) {
        string str_copy = str, temp, result;
        stack<string> res; //对字符串从前向后进行切割,用栈存储,实现逆序输出
        while(str_copy.find(' ') != string::npos){
            temp = str_copy.substr(0,str_copy.find_first_of(' '));
            res.push(temp);
            str_copy.erase(0, str_copy.find_first_of(' ') + 1);
        }
        res.push(str_copy);
        while(res.size() > 1) {
            result += res.top();
            result += ' ';
            res.pop();
        }
        result += res.top();
        return result;
    }
};

##Solution2:
这应该是书上的思路了。。

class Solution {
public:
    string ReverseSentence(string str) {
        if (str.size() <= 1) return str;
        if (str.find_first_of(' ') == string::npos) 
            return str;
        reverse(str.begin(), str.end());
        int slow = 0, fast = 0;
        for (int i = 0; i < str.size(); ) {
            int j = i;
            while (j + 1 < str.size() && str[j + 1] != ' ')
                j++;
            my_swap(str, i, j);
            if (j + 2 < str.size())
                i = j + 2;
            else break;
        }
        return str;
    }
    
private:
    void my_swap(string &str, int start, int end) {
        int left = start, right = end;
        while (left < right) {
            char tmp = str[left];
            str[left] = str[right];
            str[right] = tmp;
            left++; right--;
        }
        return;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值