iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

Codewar 進進出出 JS/Ruby系列 第 25

你是幾號?

  • 分享至 

  • xImage
  •  

題目:
(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"

""
=> ""

思考方式:

  1. 先把字串拆成單字陣列
  2. 檢查單字內的數字
  3. 由小到大排序後回傳

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 抓出來作為排序的依據,
真的是超聰明的!


上一篇
奇數排隊站好
下一篇
打開數字
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言