0%

LeetCode-刷題筆記

文章目的

想要利用系列的文章,來記錄一下自己刷 LeetCode 的解題筆記,方便日後複習。

前言

筆者在前端領域還是個小菜雞XD,目前刷題方向為 LeetCode 免費試題中難度為 Easy 的題目,刷題語言部分則是 JavaScript。

Single Number


題目連結

目的

此題主要目的是丟入一個整數陣列,其中數字都會成對,僅有一個數字非成對,要找出非成對數字為何?

思考方向

筆者的想法是透過 forEachfilter 來幫我達到目的,來看一下程式碼:

1
2
3
4
5
6
7
8
9
10
const singleNumber = function(nums) {
let target = null
nums.forEach((item) => {
const arr = nums.filter(num => num === item)
if (arr.length === 1) {
target = arr[0]
}
})
return target
}

透過 forEach 查看每個數字,查看的同時利用 filter 將陣列中有相同數字的 item 組成一個新陣列,若陣列長度為一代表陣列中的數字即為唯一的數字

更好方法

因為上面的方法透過 target 這個變數去儲存新的 array,對於記憶體佔用來說不是非常好,所以可以這樣改寫來加強對記憶體效能的改善:

1
2
3
const singleNumber = function(nums) {
return nums.filter(num => nums.indexOf(num) === nums.lastIndexOf(num))
}

這個方法從頭找第一個 index 跟從尾找第一個 index,如果一樣就代表該數字僅存在一個

Running Sum of 1d Array


題目連結

目的

此題目的要傳入一個數字陣列到函數中,函數能回傳陣列中的逐漸加總,像是丟入 [1, 2, 3] 就要回傳 [1, 3, 6],原因為 [1, 1+2, 1+2+3]。

思考方向

筆者想法是透過 reduce 將每次加總結果丟入新的陣列,最後回傳該陣列,程式碼如下:

1
2
3
4
5
6
7
8
9
10
const runningSum = function(nums) {
let target = []
const arr = nums.reduce((prev, next) => {
const total = prev + next
target.push(total)
return total
}, 0)

return target
}

更好方法

但上面的方法,其實並沒有很好,因為這寫法會讓 arr 變得毫無意義。
會造成這原因是我對於 reduce 的用法不夠熟悉,後來發現了一個更棒的解法:

1
2
3
4
const runningSum = nums => {
nums.reduce((a, c, i, arr) => arr[i] += a)
return nums
}

reduce 共有四個參數可以做操作,但我只注意到前兩個,恕不知這題可以活用後面的參數來解,iarr 分別代表目前值的索引與我們使用 reduce 的陣列。
透過 arr[i] += a 就可以定義當下陣列的索引值等於索引值加上前一個值。

Richest Customer Wealth


題目連結

目的

這題有點像是情境題,題目要我們把複數個帳號(複數個 array)用一個大 array 包住後丟入函數中,並回傳帳號加總的最大值以找出最有錢的人。

思考方向

筆者當下的想法是先透過迴圈將每個 array 裡面的值加總後產生一個擁有每個帳號加總的新 array,再將新 array 透過 sort 降冪排序,最後回傳排序完的第一個值:

1
2
3
4
5
6
7
8
9
const maximumWealth = function(accounts) {
const arr = accounts.map((item) => {
return item.reduce((prev, next) => prev + next)
})

const sortArr = arr.sort((prev, next) => next - prev)

return sortArr[0]
}

更好方法

Math.max 可以幫助我們找到 array 中的最大值,改寫的方法如下:

1
2
3
4
5
const maximumWealth = function(accounts) {
return Math.max(...accounts.map(account =>
account.reduce((accumulator, current) => accumulator + current, 0)
))
}

這個方法省略了上方的 sort 也可以達到效果。