iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

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

加起來

題目:
(6 級) Two Sum
請寫一個接收一組數字陣列 (測試用的整數) 和 一個目標數字的 function。
請從陣列當中找出兩個,相加後剛好等於目標的數字。
並像這樣:(index1, index2) 回傳這兩個數字的 index

出於這個 kata 的目的,某些測試可能有多個答案,任何有效的解決方案都將被接受。

給予的參數將始終有效 (陣列的長度將為 2 或更大,並且僅包含數字;目標數字將始終是該陣列中兩個不同元素的總和)。

此 kata 根據 leetcode 題目建立。

範例:

two_sum([1, 2, 3] 4) === (0, 2)

思考方式:

  1. 用迴圈跑陣列 numbers
  2. target 減去陣列中的每一個 element
  3. 如果陣列中有恰好符合減去的數字,就回傳 index

Ruby 解法:

def two_sum(numbers, target)
  # 先做一個空陣列準備放找到的 index
  result = []
	
  # 開始跑迴圈
  numbers.each_with_index { |n, index|
    # 為了避免更動到原本的陣列,使用 dup 方法複製一個新的陣列
    arr = numbers.dup
    # 目前拿出來比對的數字先改為 nil
    arr[index] = nil
		
    # 如果 arr 裡面有符合減去後的數字
    if arr.include?(target - n)
      # 把當下數字的 index 放進 result
      result << index
      # 以及符合數字的 index 也放進 result
      result << arr.index(target - n)
      # 並且回傳結果
      return result
    end
  }
end

心得:
一開始在 leetcode 看到這個題目的時候完全沒有頭緒,但經過前面二十天的刷題之後,漸漸地能抓住一些要領,雖然跟解答的寫法比起來還是有很大一段距離,但能慢慢感覺到自己有在進步。


JavaScript 解法:

function twoSum(numbers, target) {
  // 個人習慣先把陣列長度指定給變數
  let length = numbers.length;
  
  // 第一層迴圈從 index 0 開始,index -2 結束
  for (let i = 0; i < length - 1; i++) {
    // 第二層迴圈從 index 1 開始,index -1 結束
    for (let j = 1; j < length; j++) {
      // 如果兩個數字相加之和剛好等於 target
      // 直接回傳兩個數字的 index
      if (numbers[i] + numbers[j] === target) return [i, j];
    }
  }
}

心得:
寫完 Ruby 的解法之後看到解答,發現很多人都使用雙重迴圈的方式作答,於是嘗試用 JavaScript 寫看看,果然寫起來比之前的方式簡潔許多。


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

尚未有邦友留言

立即登入留言