删除数组A中存在于数组B中的所有元素,不使用双循环



那么,作为输入,我有两个数组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) )

最新更新