今天遇到个面试题:A、B是两个数组里面全是数字,并且按照顺序排列;写一个方法判断A是否是B的子集。要求不能用原生方法
当时不知道咋想的了,反正一塌糊涂,回来整理下思路
这个肯定是要循环比较的
function iscontent(A, B) {
let alen = A.length
let blen = B.length
let index = 0
let match = 0
let n = 0
A:for(let i = 0; i<alen; i++) {
for(let j = index; j < blen; j++) {
n++
if(A[i] === B[j]) {
index = j + 1
match++
if(match === alen) break A
continue A
}
}
}
console.log(n)
return match == alen
}
这个虽然是做了两次循环,但是实际上只是B循环比较了。但是有较多的lable跳转;于是想到直接循环B比较
function iscontent(A, B) {
let a = [...A]
let blen = B.length
for(let i = 0; i < blen; i++) {
if(B[i] === a[0]) {
if(!a.length) {
break
}
a.shift()
}
}
return !a.length
}
第二个方法就简单得多,不再需要循环A;而是使用a的拷贝数组的shift删除匹配元素,最后根据a的长度判断是否全部匹配