那么,作为输入,我有两个数组A和b,让我们假设这些是这两个数组中的值:
=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10)和B =(1、3、5、7、9]
删除后数组A应为[2,4,6,8,10]。
我已经写了(Javascript)这个功能算法来解决这个问题:
for (var i=0; i < A.length; i++) {
for (var j=0; j < B.length; j++) {
if(B[j] == A[i])
A.splice(i, 1) // Removes 1 element of the array starting from position i
}
}
我想知道,不使用双循环是否可以解决这个问题?
这个呢:
let A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ;
const B = [1, 3, 5, 7, 9];
A = A.filter(num => !B.includes(num));
是的。你可以用Set
。在Set操作方面,您正在计算差异A B
。
当使用includes()
或双for
循环到O(n)
时,使用一个优化的O(1)
时间查找集将大大加快O(n²)
的计算速度。
const A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const B = [1, 3, 5, 7, 9]
const setB = new Set(B);
const difference = A.filter(x => !setB.has(x));
console.log(difference);
可能吗?
const
A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
, B = [1, 2, 3, 5, 7, 9] // no gaps in 1,2 and 2,3
;
for (let i =0, j=0 ; i < A.length; i++)
{
if (A[i]===B[j]) { A.splice(i--,1); j++ }
}
document.write( JSON.stringify(A) )
或(更快的代码)
const
A = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
, B = [ 1, 3, 5, 7, 9 ]
;
for (let i = A.length, j= B.length -1 ; i-- ; )
{
if (A[i]===B[j]) { A.splice(i,1); j-- }
}
document.write( JSON.stringify(A) )