找出長度最長的那個字串的字數
好的,要從一個字串陣列中找出
const s = ['一二三', '一二', '一二三四五', '短', '']; // 加入更多測試案例,包括空字串
functionfindMaxLengthLoop(arr) {
if (!arr || arr.length === 0) {
return 0; // 或者拋出錯誤,或返回 -1 等,表示空陣列或無效輸入
}
let maxLength = 0;
for (let i = 0; i < arr.length; i++) {
const currentLength = arr[i].length;
if (currentLength > maxLength) {
maxLength = currentLength;
}
}
return maxLength;
}
const longestLengthLoop = findMaxLengthLoop(s);
console.log("For loop - Max length:", longestLengthLoop); // 輸出: 5
邏輯: 初始化一個 maxLength 為 0。遍歷陣列中的每個字串,獲取其長度,如果當前長度大於 maxLength,則更新 maxLength。優點: 非常直觀,容易理解。缺點: 相對其他方法,程式碼稍長。
functionfindMaxLengthReduce(arr) {
if (!arr || arr.length === 0) {
return 0;
}
return arr.reduce((maxLength, currentString) => {
return Math.max(maxLength, currentString.length);
}, 0); // 初始值設為 0
}
const longestLengthReduce = findMaxLengthReduce(s);
console.log("Reduce - Max length:", longestLengthReduce); // 輸出: 5
邏輯: reduce 方法遍歷陣列,將每個元素(currentString)與一個累加器(maxLength)進行比較。Math.max() 用於返回兩者中的較大值。初始累加器值設為 0。優點: 更函數式,程式碼更簡潔。缺點: 對於不熟悉 reduce 的人來說,初看可能不如 for 迴圈直觀。
functionfindMaxLengthMap(arr) {
if (!arr || arr.length === 0) {
return 0;
}
const lengths = arr.map(str => str.length); // 獲取所有字串的長度組成新陣列
return Math.max(...lengths); // 使用展開運算符將長度陣列傳給 Math.max
}
const longestLengthMap = findMaxLengthMap(s);
console.log("Map & Math.max - Max length:", longestLengthMap); // 輸出: 5
邏輯: 使用 map() 將原始字串陣列轉換為一個只包含每個字串長度的數字陣列。 使用 Math.max() 並配合展開運算符 (...) 找到這個數字陣列中的最大值。
優點: 步驟清晰,易於理解。缺點: 需要創建一個中間的長度陣列,對於非常大的陣列可能略有額外記憶體開銷(但通常可忽略)。
functionfindMaxLengthSort(arr) {
if (!arr || arr.length === 0) {
return 0;
}
// 複製陣列以避免修改原陣列
const sortedArr = [...arr].sort((a, b) => b.length - a.length); // 按長度降序排序
return sortedArr[0].length; // 取第一個(最長的)的長度
}
const longestLengthSort = findMaxLengthSort(s);
console.log("Sort - Max length:", longestLengthSort); // 輸出: 5
邏輯: 將陣列按字串長度降序排序,然後取第一個元素的長度。優點: 如果您還需要排序後的陣列用於其他目的,這可能順便完成。缺點: 效率最低! 排序的時間複雜度通常是 O(n log n),而我們只需要遍歷一次 (O(n)) 就能找到最大長度。對於這個特定問題,排序是「殺雞用牛刀」。
Array.prototype.reduce() (方法二) 是最簡潔且函數式的寫法。Array.prototype.map() + Math.max(...lengths) (方法三) 步驟清晰,也很好。傳統的 for 迴圈 (方法一) 非常直觀,對於初學者或追求明確性的情況也完全沒問題。
留言
張貼留言