題目:
(6 級) Two Sum
請寫一個接收一組數字陣列 (測試用的整數) 和 一個目標數字的 function。
請從陣列當中找出兩個,相加後剛好等於目標的數字。
並像這樣:(index1
, index2
) 回傳這兩個數字的 index
。
出於這個 kata 的目的,某些測試可能有多個答案,任何有效的解決方案都將被接受。
給予的參數將始終有效 (陣列的長度將為 2 或更大,並且僅包含數字;目標數字將始終是該陣列中兩個不同元素的總和)。
此 kata 根據 leetcode 題目建立。
範例:
two_sum([1, 2, 3] 4) === (0, 2)
思考方式:
numbers
target
減去陣列中的每一個 element
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 寫看看,果然寫起來比之前的方式簡潔許多。