原始題目如下:(6kyu)
You are given an array(list) strarr of strings and an integer k. Your task is to return the first longest string consisting of k consecutive strings taken in the array.
翻譯:
多個長度不同的字串組成陣列,給一整數k
,在陣列中必須找到連續k個字串,其字元總長度最長。
範例:
longestConsec(["zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"], 2) --> "abigailtheta"
n being the length of the string array, if n = 0 or k > n or k <= 0 return "".
function longestConsec(strarr, k) {
if (strarr.length === 0 || k > strarr.length || k <= 0) return ''
let result = strarr.slice(0, k)
for (let i = 1; i <= strarr.length - k; i++) {
let b = strarr.slice(i, k + i)
result.reduce((acc, cur) => acc + cur, '').length >= b.reduce((acc, cur) => acc + cur, '').length ? result = result : result = b
}
return result.reduce((acc, cur) => acc + cur, '')
}
先宣告一result
陣列,內容為strarr
陣列的前k個元素。
使用for loop
產生b陣列strarr.slice(i,k+i)
。
比較result
和b
陣列元素的總長度,長度大的為新的result
陣列。
繼續下一輪....
最後result
的元素總長度就是結果!
function longestConsec(strarr, k) {
if (k <= 0 || k > strarr.length) {
return '';
}
return strarr.reduce((long, item, i) => {
const currString = strarr.slice(i, i + k).join('');
return (currString.length > long.length)
? currString
: long;
}, '');
}
完美使用reduce
!reduce()
本身就有迭代的作用,就不用for loop包起來。每一次或每一輪都會產生currString
,長度大的當下次的long
。
每一次迭代都是一個新的block,每一次的常數currString只在自己的block範圍裡,所以沒有問題~
看完自己的寫法....reduce
只一昧地拿來加總...有點可惜,也不需要,因為使用join()
就已經可以加總字串了
以下內容取自Javascript.info-Array methods
當我們需要一一遍歷陣列進行迭代時,可以使用forEach
for
或是 for..of
當我們需要進行迭代的同時又需要回傳data給每一個元素,可以使用map
reduce()
也類似,只是它會去計算出一個單一值出來!
語法:arr.reduce(callback( accumulator, currentValue, [, index[, array]] )[, initialValue])
或是簡化一點let value = arr.reduce(function(accumulator, item, index, array) { // ... }, [initial]);
這個reduce
中的function
:
參數說明:
結果
,第一輪時,值為initial
每一輪function的result都是下一輪的第一個參數accumulator
!
範例:
let arr = [1, 2, 3, 4, 5];
let result = arr.reduce((sum, current) => sum + current, 0);
alert(result); // 15
一個加總範例,function傳給reduce
兩個參數就夠了sum
和current
在第一輪時,sum即為初始值0
(reduce的最後一個參數),current
為陣列中第一個元素1
,所以這個function執行完,結果是1
。(這個結果會是下一輪的sum)
在第二輪時,sum等於1
,再把它加上陣列的第二個元素2
,並回傳
在第三輪時,sum等於3
,再持續一個一個加上陣列中的元素....
sum | current | result | |
---|---|---|---|
第一輪 | 0 | 1 | 1 |
第二輪 | 1 | 2 | 3 |
第三輪 | 3 | 3 | 6 |
第四輪 | 6 | 4 | 10 |
第五輪 | 10 | 5 | 15 |
以下寫法的結果還是一樣15
,但運作方式不同。當不給初始值時,reduce會取陣列中第一個元素當作初始值,並從第二個元素開始進行迭代 (只遍歷了四次)
let arr = [1, 2, 3, 4, 5];
// removed initial value from reduce (no 0)
let result = arr.reduce((sum, current) => sum + current);
alert( result ); // 1
有無給初始值會影響迭代的起始位置不同,如下圖:
盡量還是給reduce初始值比較好,以免出現以下的類似錯誤:
let arr = [];
// Error: Reduce of empty array with no initial value
// if the initial value existed, reduce would return it for the empty arr.
arr.reduce((sum, current) => sum + current);
以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。