Jeff的隨手筆記

學習當一個前端工程師

0%

用LeetCode寫日記-Day5

今天才發現原來在題目上面有寫這是什麼樣的主題,前幾天都是Closures今天開始進入Basic Array Transformations

Day 5: Apply Transform Over Each Element in Array

問題描述:

Given an integer array arr and a mapping function fn, return a new array with a transformation applied to each element.

The returned array should be created such that returnedArray[i] = fn(arr[i], i).

Please solve it without the built-in Array.map method.

問題難度:Easy

問題限制:

  • 0 <= arr.length <= 1000
  • 109 <= arr[i] <= 109
  • fn returns a number

我的解題思路

我想題目應該就是要我們把arr在fn裡面遍歷出來。

在不能用map的情況下用最簡單的for迴圈:

1
2
3
4
5
6
7
var map = function(arr, fn) {
let newArr = []
for (let i = 0 ; i< arr.length; i++) {
newArr.push(fn(arr[i]))
}
return newArr
};

但在第2個測試出現錯誤,回傳NAN。

原因在於它需要兩個參數,但我只給一個參數,因此只要解決這個問題就可以了。

1
2
3
4
5
6
7
var map = function(arr, fn) {
let newArr = []
for (let i = 0 ; i< arr.length; i++) {
newArr.push(fn(arr[i], i))
}
return newArr
};

在執行fn時,給參數多給一個i即可。

其他解法

使用forEach:

1
2
3
4
5
6
7
var map = function(arr, fn) {
const transformedArr = [];
arr.forEach((element, index) => {
transformedArr[index] = fn(element, index);
});
return transformedArr;
};

使用 for…of 迴圈:

1
2
3
4
5
6
7
8
9
var map = function(arr, fn) {
const transformedArr = [];
let index = 0;
for (const element of arr) {
transformedArr[index] = fn(element, index);
index++;
}
return transformedArr;
};

結語

當下看到題目限制時我整個驚慌失措,我就都只用map()不用我不會啊。
雖然當下有閃過用ForEach,但實在是想不起來要怎麼去使用它,因此用了最基本的for迴圈來完成這題。