溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript怎么實(shí)現(xiàn)兩個(gè)數(shù)組的交集

發(fā)布時(shí)間:2022-03-28 10:22:20 來源:億速云 閱讀:298 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“JavaScript怎么實(shí)現(xiàn)兩個(gè)數(shù)組的交集”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“JavaScript怎么實(shí)現(xiàn)兩個(gè)數(shù)組的交集”文章能幫助大家解決問題。

兩個(gè)數(shù)組的交集 I

給定兩個(gè)數(shù)組 nums1 和 nums2 ,返回 它們的交集 。輸出結(jié)果中的每個(gè)元素一定是 唯一 的。我們可以 不考慮輸出結(jié)果的順序 。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解釋:[4,9] 也是可通過的

注:

  • 1 <= nums1.length, nums2.length <= 1000

  • 0 <= nums1[i], nums2[i] <= 1000

解題思路:

如果兩個(gè)數(shù)組是有序的,則可以使用雙指針的方法得到兩個(gè)數(shù)組的交集。

首先對(duì)兩個(gè)數(shù)組進(jìn)行排序,然后使用兩個(gè)指針遍歷兩個(gè)數(shù)組??梢灶A(yù)見的是加入答案的數(shù)組的元素一定是遞增的,為了保證加入元素的唯一性,我們需要額外記錄變量 pre 表示上一次加入答案數(shù)組的元素。

初始時(shí),兩個(gè)指針分別指向兩個(gè)數(shù)組的頭部。每次比較兩個(gè)指針指向的兩個(gè)數(shù)組中的數(shù)字,如果兩個(gè)數(shù)字不相等,則將指向較小數(shù)字的指針右移一位,如果兩個(gè)數(shù)字相等,且該數(shù)字不等于 pre ,將該數(shù)字添加到答案并更新 pre 變量,同時(shí)將兩個(gè)指針都右移一位。當(dāng)至少有一個(gè)指針超出數(shù)組范圍時(shí),遍歷結(jié)束。

JavaScript 實(shí)現(xiàn):

var intersection = function(nums1, nums2) {
nums1.sort((x, y) => x - y);
nums2.sort((x, y) => x - y);
const length2 = nums1.length, length3 = nums2.length;
let index1 = 0, index2 = 0;
const intersection = [];
while (index1 < length2 && index2 < length3) {
const num1 = nums1[index1], num2 = nums2[index2];
if (num1 === num2) {
// 保證加入元素的唯一性
if (!intersection.length || num1 !== intersection[intersection.length - 1]) {
intersection.push(num1);
}
index1++;
index2++;
} else if (num1 < num2) {
index1++;
} else {
index2++;
}
}
return intersection;
};

兩個(gè)數(shù)組的交集 II

與 I 相通的類似的一道題:

給你兩個(gè)整數(shù)數(shù)組 nums1 和 nums2 ,請(qǐng)你以數(shù)組形式返回兩數(shù)組的交集。返回結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中都出現(xiàn)的次數(shù)一致(如果出現(xiàn)次數(shù)不一致,則考慮取較小值)。可以不考慮輸出結(jié)果的順序。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2,2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[4,9]

解題思路:

如果兩個(gè)數(shù)組是有序的,則可以使用雙指針的方法得到兩個(gè)數(shù)組的交集。

首先對(duì)兩個(gè)數(shù)組進(jìn)行排序,然后使用兩個(gè)指針遍歷兩個(gè)數(shù)組。

初始時(shí),兩個(gè)指針分別指向兩個(gè)數(shù)組的頭部。每次比較兩個(gè)指針指向的兩個(gè)數(shù)組中的數(shù)字,如果兩個(gè)數(shù)字不相等,則將指向較小數(shù)字的指針右移一位,如果兩個(gè)數(shù)字相等,將該數(shù)字添加到答案,并將兩個(gè)指針都右移一位。當(dāng)至少有一個(gè)指針超出數(shù)組范圍時(shí),遍歷結(jié)束。

JavaScript 實(shí)現(xiàn):

/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
//將兩個(gè)數(shù)組從小到大排序
nums1.sort((a,b) => a-b)
nums2.sort((a,b) => a-b)
let res = []
let key1 = 0, key2 = 0, index = 0
//在兩個(gè)指針不達(dá)邊界的前提下不斷推進(jìn)
while(key1 < nums1.length && key2 < nums2.length){
//判斷nums1[key1]與nums2[key2]的大小,分出大于小于等于三種情況
if(nums1[key1] < nums2[key2]) key1++
else if(nums1[key1] > nums2[key2]) key2++
else{
res[index++] = nums1[key1]
key1++
key2++
}
}
return res
};

關(guān)于“JavaScript怎么實(shí)現(xiàn)兩個(gè)數(shù)組的交集”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI