iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
0
自我挑戰組

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

奇數排隊站好

題目:
(6 級) Sort the odd
你有一組數字陣列。
你的任務是對奇數由小到大進行排序,但偶數必須在其原本的位置。

零不是奇數,不需要移動它。如果你有一個空陣列,則回傳該空陣列。

範例:

sort_array([5, 3, 2, 8, 1, 4])
=> [1, 3, 2, 8, 5, 4]

sort_array([5, 3, 2, 8, 1, 4])
=> [1, 3, 2, 8, 5, 4]

Ruby 解法:

def sort_array(source_array)
  # 先把陣列中的奇數挑出來
  # 並由小到大排序
  odds = source_array.select(&:odd?).sort
  
  # 開始對原本陣列的數字一個個進行比對
  source_array.map.with_index { |num, index|
    # 如果原本陣列的數字是奇數
    if num.odd?
      # 拿目前奇數陣列的第一個數字 (最小的) 替換掉
      source_array[index] = odds.shift
    else
      # 若為偶數則保留原本的數字
      num
    end
  }
end

JavaScript 解法:

function sortArray(array) {
  // 先把陣列中的奇數挑出來
  // 並由小到大排序
  let odds = array.filter(n => n % 2 !== 0)
                  .sort((a, b) => a > b ? 1 : -1);
  
  // 開始對原本陣列的數字一個個進行比對
  return array.map ((num, index) => {
    // 如果原本陣列的數字是奇數
    if (num % 2 !== 0) {
      // 拿目前奇數陣列的第一個數字 (最小的) 替換掉
      return array[index] = odds.shift();
    } else {
      // 若為偶數則保留原本的數字
      return num;
    }
  });
}

心得:
看解答時發現可以使用 Enumerator 來進行迭代會更方便

def sort_array(xs)
  odd = xs.select(&:odd?).sort.each
  xs.map{ |x| x.odd? ? odd.next : x }
end
  • each 方法會把陣列轉換成 Enumerator 類別
[1, 3, 5, 7, 9].each
=> #<Enumerator: [1, 3, 5, 7, 9]:each>
  • next 方法每次呼叫時都會在 Enumerator 內部進行迭代
a = #<Enumerator: [1, 3, 5, 7, 9]:each>
a.next => 1
a.next => 3
a.next => 5
a.next => 7
a.next => 9
  • 完成內部迭代後繼續呼叫 next 方法會觸發 StopIteration
a.next
Traceback (most recent call last):
        5: from /Users/parker/.rvm/rubies/ruby-2.6.5/bin/irb:23:in `<main>'
        4: from /Users/parker/.rvm/rubies/ruby-2.6.5/bin/irb:23:in `load'
        3: from /Users/parker/.rvm/rubies/ruby-2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        2: from (irb):23
        1: from (irb):23:in `next'
StopIteration (iteration reached an end)

上一篇
加起來
下一篇
你是幾號?
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言