題目:
(6 級) Your order, please
你的任務是重新排序拿到的字串,每個單字都會包含一個數字,這個數字代表該單字應該排在哪個位置。
注意:數字只會從 1
開始到 9
結束,所以 1
代表第一個單字 (不是 0
)
如果傳進來的字串為空字串,那麼便回傳空字串。
傳進來的字串僅會包含有效的連續數字。
範例:
"is2 Thi1s T4est 3a"
=> "Thi1s is2 3a T4est"
"4of Fo1r pe6ople g3ood th5e the2"
=> "Fo1r the2 g3ood 4of th5e pe6ople"
""
=> ""
思考方式:
Ruby 解法:
def order(words)
# 先讓指標為 1 (數字將從 1 開始)
index = 1
# 把參數字串拆開成陣列
arr = words.split
# 準備一個裝結果的陣列
result = []
# 只要 index 不超過陣列的長度就繼續跑迴圈
while index <= arr.length
# 每次迴圈挑出數字等於 index 的單字
picked = arr.select { |word|
word.split("").include?(index.to_s)
}
# 把挑出來的單字放進結果陣列中
result += picked
# index 加 1 以便挑選下一個單字
index += 1
end
# 最後把挑好的單字轉回字串後回傳
result.join(" ")
end
JavaScript 解法:
function order(words){
// 把參數字串拆開成陣列
let arr = words.split(" ");
// 準備一個裝結果的陣列
let result = [];
// 迴圈從 1 開始到陣列長度為止結束
for (let i = 1; i <= arr.length; i++) {
// 每次迴圈挑出數字等於 i 的單字
let picked = words.split(" ").filter((word, index) => {
return word.includes(i.toString())
});
// 把挑出來的單字轉回字串放進結果陣列中
result.push(picked.toString());
}
// 最後把挑好的單字轉回字串後回傳
return result.join(" ");
}
心得:
看解答時發現一個超厲害的寫法,
def order(words)
words.split.sort_by{ |w| w[/\d/] }.join(' ')
end
Ruby 的 sort_by 可以讓你用想要的方式進行排序,
而上面的寫法同時還用了 regex 把單字當中的 digit 抓出來作為排序的依據,
真的是超聰明的!