專用車網(wǎng)站建設(shè)哪家好比較靠譜的電商培訓(xùn)機(jī)構(gòu)
文章目錄
- 1、查找數(shù)組中的最大值
- 方法一:使用 Math.max 和展開(kāi)運(yùn)算符
- 方法二:使用 for 循環(huán)逐一比較
- 2、查找數(shù)組中的第二大值
- 方法一:排序后取第二大值
- 方法二:遍歷找到第二大值
- 3、去除數(shù)組中的重復(fù)項(xiàng)
- 4、合并兩個(gè)有序數(shù)組并保持有序
- 5、旋轉(zhuǎn)數(shù)組
- 6、判斷兩個(gè)數(shù)組是否相等
- 7、總結(jié)
1、查找數(shù)組中的最大值
給定一個(gè)數(shù)字?jǐn)?shù)組,如何找出其中的最大值
方法一:使用 Math.max 和展開(kāi)運(yùn)算符
這是最直接的解決方案。
可以使用 Math.max,并通過(guò)展開(kāi)運(yùn)算符將數(shù)組元素傳遞進(jìn)去。這樣不僅語(yǔ)法簡(jiǎn)潔,而且邏輯也很清晰。
const numbers = [1, 5, 3, 9, 2];
function findLargest(arr) {return Math.max(...arr);
}
console.log(findLargest(numbers)); // 輸出:9
解析:在這里,Math.max(…arr) 將數(shù)組解包成單個(gè)參數(shù)傳入 Math.max,一行代碼就能返回最大值。
“如果數(shù)組很大,這種方法還適用嗎?” 展開(kāi)運(yùn)算符可能會(huì)在大數(shù)組上有性能問(wèn)題,因?yàn)樗鼤?huì)消耗較多的內(nèi)存。在百萬(wàn)級(jí)別的數(shù)組上,更推薦使用 for
循環(huán)。
方法二:使用 for 循環(huán)逐一比較
使用 for 循環(huán)的方式,雖然這看起來(lái)不像是“最簡(jiǎn)單”的方法,但它能夠處理任何長(zhǎng)度的數(shù)組,無(wú)論多大,都不會(huì)受到展開(kāi)運(yùn)算符帶來(lái)的內(nèi)存限制。
const numbers = [1, 5, 3, 9, 2];
function findLargest(arr) {let max = arr[0];for (let i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;
}
console.log(findLargest(numbers)); // 輸出:9
解釋:在這個(gè)例子中,我們通過(guò) for 循環(huán)從頭遍歷數(shù)組,將當(dāng)前最大值保存在 max 中。當(dāng)遇到更大的值時(shí),更新 max。
這種方法在時(shí)間復(fù)雜度上是 O(n),而且不會(huì)引發(fā)內(nèi)存溢出,是一種更加穩(wěn)妥的處理方式。
2、查找數(shù)組中的第二大值
“如何要找到數(shù)組中的第二大值呢?” 下面展示幾種不同的方法。
方法一:排序后取第二大值
最直觀的方法就是將數(shù)組降序排列,然后取第二個(gè)值。
const numbers = [1, 5, 3, 9, 7];
function secondLargest(arr) {let sorted = arr.sort((a, b) => b - a);return sorted[1];
}
console.log(secondLargest(numbers)); // 輸出:7
分析:數(shù)組排序后,sorted[1] 就是第二大值。不過(guò)排序的時(shí)間復(fù)雜度為 O(n log n),且會(huì)改變?cè)瓟?shù)組,不是最高效的方法。
方法二:遍歷找到第二大值
如果希望更高效,可以在一次遍歷中找到第二大值。
使用兩個(gè)變量 max 和 secondMax 來(lái)記錄最大值和次大值,可以在不排序的情況下得到結(jié)果。
const numbers = [1, 5, 3, 9, 7];
function findSecondLargest(arr) {let max = -Infinity;let secondMax = -Infinity;for (let num of arr) {if (num > max) {secondMax = max;max = num;} else if (num > secondMax && num < max) {secondMax = num;}}return secondMax;
}
console.log(findSecondLargest(numbers)); // 輸出:7
解釋:這段代碼在一次循環(huán)中完成,時(shí)間復(fù)雜度為 O(n)。max 記錄當(dāng)前最大值,secondMax> 記錄次大值。每次遇到新的最大值時(shí),更新這兩個(gè)變量,保證 secondMax 是最大值之外的最大元素。
3、去除數(shù)組中的重復(fù)項(xiàng)
方法:使用 Set 去重
使用 Set 是最快捷的方式,Set 會(huì)自動(dòng)去除重復(fù)元素。
const numbers = [1, 2, 2, 3, 4, 4, 5];
function removeDuplicates(arr) {return [...new Set(arr)];
}
console.log(removeDuplicates(numbers)); // 輸出:[1, 2, 3, 4, 5]
解析:在這里,Set 自動(dòng)去重,然后再用展開(kāi)運(yùn)算符將 Set 轉(zhuǎn)換回?cái)?shù)組。操作簡(jiǎn)單且性能優(yōu)越,特別適用于中小規(guī)模的數(shù)據(jù)處理。
4、合并兩個(gè)有序數(shù)組并保持有序
將兩個(gè)已排序的數(shù)組合并并保持順序。
concat 和 sort 是一種快速實(shí)現(xiàn)的方式。
方法:使用 concat 和 sort
const arr1 = [1, 3, 5];
const arr2 = [2, 4, 6];
function mergeArrays(arr1, arr2) {return arr1.concat(arr2).sort((a, b) => a - b);
}
console.log(mergeArrays(arr1, arr2)); // 輸出:[1, 2, 3, 4, 5, 6]
解釋:concat 拼接數(shù)組,然后用 sort 進(jìn)行升序排列。這種方法簡(jiǎn)單直觀,但如果有大量數(shù)據(jù)時(shí),concat 的內(nèi)存消耗和 sort> 的效率需要注意。
5、旋轉(zhuǎn)數(shù)組
“寫一個(gè)函數(shù),將數(shù)組右移 k 次。”
這要求數(shù)組中的每個(gè)元素向右“移動(dòng)”指定的次數(shù)。比如,給定 [1, 2, 3, 4, 5],右移 2 次后數(shù)組應(yīng)變成 [4, 5, 1, 2, 3]。這類旋轉(zhuǎn)操作在數(shù)據(jù)處理和算法應(yīng)用中十分常見(jiàn)。
使用 slice 和 concat 拼接旋轉(zhuǎn)后的數(shù)組。
const arr = [1, 2, 3, 4, 5];
function rotateArray(arr, k) {k = k % arr.length; // 防止 k 超出數(shù)組長(zhǎng)度return arr.slice(-k).concat(arr.slice(0, -k));
}
console.log(rotateArray(arr, 2)); // 輸出:[4, 5, 1, 2, 3]
代碼詳解處理超長(zhǎng)旋轉(zhuǎn)次數(shù):首先,k = k % arr.length 這一行確保旋轉(zhuǎn)次數(shù)不會(huì)超出數(shù)組長(zhǎng)度。比如當(dāng) k = 7 時(shí),這段代碼將> k 變?yōu)?2(7 % 5 = 2),這相當(dāng)于只旋轉(zhuǎn)了 2 次,避免了多余的操作。
分割數(shù)組:接下來(lái),用 slice 方法將數(shù)組分成兩個(gè)部分,分別取出數(shù)組的尾部和前面的部分:arr.slice(-k) 用來(lái)取出數(shù)組最后 k> 個(gè)元素。比如當(dāng) k = 2 時(shí),arr.slice(-2) 會(huì)返回 [4, 5]。arr.slice(0, -k)> 則獲取數(shù)組的前面部分,不包括最后 k 個(gè)元素。對(duì) [1, 2, 3, 4, 5] 使用 arr.slice(0, -2),結(jié)果就是 [1,> 2, 3]。拼接旋轉(zhuǎn)后的數(shù)組:最后,你用 concat 將這兩個(gè)部分組合起來(lái),把尾部的 [4, 5] 放到 [1, 2, 3]> 的前面,完成右移操作。整個(gè)代碼執(zhí)行后得到 [4, 5, 1, 2, 3],實(shí)現(xiàn)了右移 2 次的效果。
詳細(xì)說(shuō)明:假設(shè) arr = [1, 2, 3, 4, 5],k = 2。我們需要將數(shù)組右移 2 次,讓 [4, 5] 出現(xiàn)在數(shù)組開(kāi)頭。使用> slice(-2) 得到 [4, 5]。使用 slice(0, -2) 得到 [1, 2, 3]。把這兩個(gè)部分拼接起來(lái),得到最終的 [4,> 5, 1, 2, 3]。
關(guān)鍵點(diǎn)總結(jié)循環(huán)優(yōu)化:通過(guò) k % arr.length 確保旋轉(zhuǎn)次數(shù)不會(huì)超過(guò)數(shù)組長(zhǎng)度,從而優(yōu)化效率。
分割和拼接:利用 slice 和 concat 組合,可以輕松實(shí)現(xiàn)數(shù)組的旋轉(zhuǎn)效果。
6、判斷兩個(gè)數(shù)組是否相等
方法:逐個(gè)元素比較
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
function arraysEqual(arr1, arr2) {if (arr1.length !== arr2.length) return false;for (let i = 0; i < arr1.length; i++) {if (arr1[i] !== arr2[i]) return false;}return true;
}
console.log(arraysEqual(arr1, arr2)); // 輸出:true
console.log(arraysEqual([1, 2, 3], [1, 2, 4])); // 輸出:false
解析:逐個(gè)元素對(duì)比可以確保內(nèi)容和順序一致。此方法適用于小型數(shù)組,因?yàn)闀r(shí)間復(fù)雜度為 O(n)。
7、查找數(shù)組中和為特定值的所有數(shù)對(duì)
這涉及到去重和優(yōu)化算法的問(wèn)題。
方法:使用 Set 記錄和查找補(bǔ)數(shù)
const arr = [1, 2, 4, 3, 5, 7, 8, 9];
const target = 10;
function findPairs(arr, target) {let result = [];let seen = new Set();for (let num of arr) {let complement = target - num;if (seen.has(complement)) {result.push([num, complement]);}seen.add(num);}return result;
}console.log(findPairs(arr, target)); // 輸出:[[3, 7], [2, 8], [1, 9]]
解析:通過(guò) Set 記錄遍歷過(guò)的數(shù),找到符合條件的數(shù)對(duì)。
利用查找補(bǔ)數(shù)的方式,避免重復(fù)數(shù)對(duì),且比雙重循環(huán)效率更高。
7、總結(jié)
上面7中常用 JavaScript 操作數(shù)組方法,從最簡(jiǎn)單的查找最大值到復(fù)雜的數(shù)對(duì)查找,涵蓋了去重、排序、旋轉(zhuǎn)等經(jīng)典操作;希望能幫到你!!!
別人可以拷貝我的模式,不能拷貝我的苦難,不能拷貝我不斷往前的激情。