題目:
(7 級) Peak array index
你會得到一個整數陣列,請回傳 index
,使該 index
右側的元素總和等於 index
左側的元素總和。
如果沒有則回傳 -1
。
如果有多個這樣的 index
,則回傳最左邊的 index
。
範例:
peak([1,2,3,5,3,2,1]) = 3
因為 index 為 0, 1, 2 的總和等於 index 為 4, 5, 6 的總和
peak([1,12,3,3,6,3,1]) = 2
peak([10,20,30,40]) = -1
Ruby 解法:
def peak(arr)
# 把 arr 中的每個 element 和 index 拿出來比對
arr.each_with_index {|num, index|
# 如果左邊的總和等於右邊的總和
if arr[0..index].sum == arr[index..-1].sum
# 回傳該 index
return index
end
}
# 如果都沒有找到符合條件的 index 則回傳 -1
return -1
end
JavaScript 解法:
function peak(arr){
// 先將變數 left, right, first 都設定為 0
// left 代表陣列左邊總和
let left = 0;
// right 代表陣列右邊總和
let right = 0;
// first 代表由左邊開始的 index
let first = 0;
// 變數 last 為由右邊開始的 index
let last = arr.length - 1;
// 開始比對 first 和 last 分別代表的 index
while (first < last) {
// 如果陣列左邊的總和大於右邊總和
if (left > right){
// 就讓 right 加上右邊的數字
right += arr[last];
// 同時 last 往左移
last--;
} else if (left <= right){
// 反之則讓 left 加上左邊的數字
left += arr[first];
// 同時 first 往右移
first++;
}
}
// 最後檢查 last 和 first 所在的 index 是否一樣
// 以及左邊總和 和 右邊總和是否一樣
return last == first && left == right ? last : -1;
}