javascript 如何从第一个数组返回一个索引数组,该数组是两个排序数组的索引的交集?

ezykj2lf  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(128)

我写了一个解决方案,它允许我从第一个数组中得到一个索引数组,这个数组是两个排序数组的索引的交集,我想知道为什么这个解决方案是错误的。当我检查它时,我从第一个数组中得到了正确的索引数组,但面试官告诉我这是错误的。
***非常感谢您的帮助和解释。***我还没有商业经验。很抱歉在英语方面有一些错误,因为我来自乌克兰,我正在提高这门语言。

// first example of input:

// const arr1 = [1, 2, 2, 2];
// const arr2 = [1, 1, 2, 2];

// second example of input:

const arr1 = [1, 2, 2, 3, 4, 5, 6, 7, 9, 9, 20];
const arr2 = [1, 2, 3, 3, 5, 8, 9, 9, 21];

// first example of output:

// - [0, 1, 2]
// - [0, 1, 3]
// - [0, 2, 3]

// second example of output:

// - [0, 1, 3, 5, 8, 9]
// - [0, 2, 3, 5, 8, 9]

//function compareItemsFn, length1, length2 - from conditions to this task

const compareItemsFn = (index1, index2) => {
    switch (true) {
        case arr1[index1] === arr2[index2]: return 0;
        case arr1[index1] < arr2[index2]: return -1;
        case arr1[index1] > arr2[index2]: return 1;
        default: return undefined;
    }
};
const length1 = arr1.length;
const length2 = arr2.length;

// function intersectionIndexes - my solution

function intersectionIndexes(compareItemsFn, length1, length2) {
    let indexesIntersectionArray = [];

    let i = 0;
    let j = 0;

    while (i < length1 && j < length2) {

        if (compareItemsFn (i, j) === 0) {
            indexesIntersectionArray.push(i);
            i++;
            j++;
        } else if (compareItemsFn (i, j) === 1) {
            j++;
        } else {
            i++;
        }
    }

    return indexesIntersectionArray;
};

const result = intersectionIndexes(compareItemsFn, length1, length2);
gmxoilav

gmxoilav1#

如果你确信你的解决方案有效,那么也许它并不是错误的,因为它给出了错误的答案,而是因为你解决问题的方式。
下面的代码简化了你的解决方案。它将两个数组作为参数,而不是它们的length属性值,这样解决方案就不会绑定到全局变量arr1arr2。你应该总是倾向于实现泛化的解决方案。
标准库中的Math.sign()方法代替了compareItemsFn函数,有时在面试中,你可能会被要求实现标准库中的功能,面试官希望看到的是你是否意识到这一点。

function simplified(arrayOne, arrayTwo) {
  let result = [];
  let indexOne = 0;
  let indexTwo = 0;

  while (indexOne < arrayOne.length && indexTwo < arrayTwo.length) {
    let signCheck = Math.sign(arrayOne[indexOne] - arrayTwo[indexTwo]);
    if (signCheck == 0) {
      result.push(indexOne);
      indexOne++;
      indexTwo++;
    } 
    else if ( signCheck > 0) {
      indexTwo++;
    }
    else {
      indexOne++;
    }
  }

  return result;
}

相关问题