Leetcode No. 151 - Reverse Words in a String

Ref

輸入一個字串,裡面會有數個單字,目標是要把單字反向輸出。如:

Input:  "this dog"
Output: "dog this"

麻煩的可能是額外的規則:輸入有可能在字串前中後都會多塞一些空白,但輸出必須還是要跟原本的一樣,如:

Input:  "    this    dog       "
Output: "dog this"

Elixir

Elixir 有提供幾個方法可以好好「利用」:

s |> String.split()
|> Enum.reverse()
|> Enum.join(" ")

考慮額外規則,移除前後空白需要用 String.trim/1;要把多 split 出來的 item 過濾要用 Enum.filter/2(或 Enum.reject/2)。照理來說,應該要寫像下面這樣:

s |> String.trim()
|> String.split()
|> Enum.filter(fn x -> x != "" end)
|> Enum.reverse()
|> Enum.join(" ")

因為 String.split/1 已經把 trim 和 filter 的事都做掉了,所以第一個寫法已經是正解了。

但要注意的是:如果使用 String.split/3 的話,它的行為就跟 String.split/1 不同,會把多餘的空白也切出一個 item,使用 iex 實驗如下:

iex(1)> "   foo   bar   " |> String.split()
["foo", "bar"]
iex(2)> " foo bar " |> String.split(" ")
["", "", "", "foo", "", "", "bar", "", "", ""]

PHP

PHP 也有提供很多函式可以用,只是空白的部分需要自己處理:

$trimed = trim($s)
$splited = explode(' ', $trimed);
$filtered = array_filter($splited, function($v) {
return '' !== $v;
});

$reversed = array_reverse($filtered);

$solution = implode(' ', $reversed);

上面是每個資料處理過程的步驟,總共用到了下面幾個函式: