給定兩個陣列,用乙個函式計算出二者交集。
let num1 = [1,2,2,1];
let num2 = [2,2];
//求出[2,2]
let num1 = [4,9,5];
let num2 = [9,4,9,8,4];
//求出[4,9]
存雜湊表
由於同乙個數字在兩個陣列中都可能出現多次,因此需要用雜湊表記錄每個數字出現的次數。對於同乙個數字,其在交集**現的次數等於該數字在兩個陣列**現次數的最小值。
首先遍歷第乙個陣列,並在雜湊表中記錄第乙個陣列中的每個數字以及對應出現的次數,然後遍歷第二個陣列,對於第二個陣列中的每個數字,如果在雜湊表中存在這個數字,則將該數字新增到答案,同時減少雜湊表中該數字出現的次數。
為了降低空間複雜度,首先遍歷較短的陣列並在雜湊表中記錄每個數字以及對應出現的次數,然後遍歷較長的陣列得到交集。
const intersect = (num1, num2) => ;
const res = ;
for (const n1 of num1) else
}for (const n2 of num2)
}return res;
};
執行結果:
let num1 = [1,2,2,1];
let num2 = [2,2];
console.log(intersect(num1,num2)); //[2,2]
雙指標方式
如果兩個陣列是有序的,則可以便捷地計算兩個陣列的交集。
首先對兩個陣列進行排序,然後使用兩個指標遍歷兩個陣列。
初始時,兩個指標分別指向兩個陣列的頭部。每次比較兩個指標指向的兩個陣列中的數字,如果兩個數字不相等,則將指向較小數字的指標右移一位,如果兩個數字相等,將該數字新增到答案,並將兩個指標都右移一位。當至少有乙個指標超出陣列範圍時,遍歷結束。
const intersect = (num1, num2) => else if (num1[p1] < num2[p2]) else
}return res;
};
執行結果:
let num1 = [4,9,5];
let num2 = [9,4,9,8,4];
console.log(intersect(num1,num2)); //[4,9]
最簡單的雙重迴圈
const intersect = (num1, num2) => }}
return res;
};
出現次數最多的整數
問題描述 編寫乙個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數n也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值列印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只列印比較小的那個值。輸入格式 第一行是乙個整數n,n 2...
出現次數最多的整數
問題描述 編寫乙個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數n也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值列印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只列印比較小的那個值。輸入格式 第一行是乙個整數n,n 2...
出現次數最多的數
出現次數最多的數 問題描述 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的乙個。輸入格式 輸入的第一行只有乙個正整數n 1 n 1000 表示數字的個數。輸入的第二行有n個整數s1,s2,sn 1 si 10000,1 i n 相鄰的數用空格分隔。輸出格式 輸出這n...