題目連結:http://oj.leetcode.com/problems/reverse-words-in-a-string/

題目概述

題目會給定一行字串,這些字串中包含了些空格與詞彙。現在要把詞彙的順序給顛倒過來,例如:把 the sky is blue 變成 blue is sky the

Clarification

  • 連續的非空白字元視為一個詞彙
  • 需要清除任何前綴或後綴之空白
  • 將連許兩個以上(含)的空白字元縮減為一個

解題思路

其實算還滿簡單的題目,只要將字串依照空白來進行切割,並把切割下的詞彙儲存起來並反向輸出即可。以往在進行字串切割時,都習慣使用 strtok 來處理。突然覺得該來找找有沒有更容易實作的方法,因而讓我發現 istringstreamostringstream 該兩個類別,用於實現將字串作為串流般操作,就像 cincout 一樣。程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution
{
public:
    void reverseWords(string &s)
	{
		istringstream strIn(s);
		ostringstream strOut;
		vector<string> words;
		string tmp;

		while (strIn >> tmp) {
			words.push_back(tmp);
		}

		while (!words.empty()) {
			strOut << words.back();
			words.pop_back();

			if (!words.empty()) {
				strOut << ' ';
			}
		}

		s = strOut.str();
    }
};

是說第一次寫 LeetCode 真不習慣,原以為要輸出到 stdout,結果拿到 Output Limit Exceeded。後來又想說更改回傳型別好了,就改成回傳 string,然後拿到 Wrong Answer。後來才發現原來要直接修改參數。

另外,LeetCode 也可以支援 Python。用 Python 來解更容易,只需要僅僅一行!程式碼如下:

1
2
3
4
5
class Solution:
    # @param s, a string
    # @return a string
    def reverseWords(self, s):
        return " ".join(s.split()[::-1])