使用 Javascript 验证第二个数组中的值是否对应于第一个数组的平方值的函数

问题描述 投票:0回答:5

我对 if-else 语句有疑问,而且 splice 似乎不起作用。

function same(arr1, arr2) {
    if (arr1.length !== arr2.length) {
        return false;
    }
    for (let i = 0; i < arr1.length; i++) {
        for (let j = 0; j < arr2.length; j++) {
            let correctIndex = arr1[i] * 2;
            if (correctIndex !== arr2[j]) {
                return false;
            }
        }
        console.log(arr2);
        arr2.splice(correctIndex, 1)
    }
    return true;
}

same([1, 2, 3, 2], [9, 1, 4, 4]);
javascript arrays for-loop if-statement compare
5个回答
2
投票

试试这个:

const sortNumber = numArray => numArray.sort((a, b) => a - b);

const same = (_arr1, _arr2) => { 
    const arr2 = sortNumber(_arr2);
    return sortNumber(_arr1).every((res,i)=>arr2[i]===res**2);
}

console.log(same([1, 2, 3, 2], [9, 1, 4, 4]))


0
投票

您需要遍历第一个数组,引用第二个数组中的相应索引。一旦找到不是正方形的条目,您可以立即返回 false。

function same(arr1, arr2){
  if(arr1.length !== arr2.length) return false;

  arr1.sort();
  arr2.sort();

  // visit each item in arr1 exactly once
  for(let i=0; i<arr1.length; i++){
    // if entry at arr2 isn't the square of that entry in arr1, return false immediately
    if(arr1[i] * arr1[i] !== arr2[i]) return false;
  }

  // we've checked each item, return true
  return true;
}

这里不需要使用

splice()
,因为你只需要返回true或false,而不需要修改任何一个数组。此外,您不需要使用嵌套 for 循环,因为您可以直接访问每个数组。


0
投票

也可以用O(n)复杂度的频率计数器的方法来检查

function same(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }

  let fc1 = {};
  let fc2 = {};

  for (let val of arr1) {
    fc1[val] = (fc1[val] || 0) + 1;
  }
  
  for (let val of arr2) {
    fc2[val] = (fc2[val] || 0) + 1;
  }

  for (let key in fc1) {
    if (!(key ** 2 in fc2)) {
      return false;
    }

    if (fc1[key] !== fc2[key ** 2]) {
      return false;
    }
  }
  
  return true;
}

0
投票

function areSquaredValues(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }
  
  const obj = {};
  
  for (let num of arr1) {
    obj[num * num] = obj[num * num] ? obj[num * num] + 1 : 1;
  }
  
  for (let num of arr2) {
    if (!obj[num] || obj[num] === 0) {
      return false;
    } else {
      obj[num] -= 1;
    }
  }
  
  return true;
}

console.log(areSquaredValues([1, 2, 3, 2], [9, 1, 4, 4]))

函数作用如下:

首先,它检查两个数组的长度是否相同。如果不是,它会立即返回 false。 然后它创建一个空对象 obj 来存储第一个数组的平方值。 然后该函数遍历第一个数组并将每个平方值作为键添加到 obj 中,该值是该平方值在数组中出现的次数。这是通过检查该键是否已存在于对象中并在存在时递增其值,或者在不存在时将其设置为 1 来完成的。 接下来,该函数遍历第二个数组并检查每个值是否是 obj 中的键。如果不是,或者它的值为 0(这意味着它已经与第二个数组中的值匹配),则该函数立即返回 false。否则,它会减少 obj 中相应键的值。 最后,如果函数在没有返回 false 的情况下完成了两次迭代,它会返回 true,因为第二个数组中的所有值都对应于第一个数组的平方值。


-1
投票

你不需要嵌套循环。这是一个带有单个 for 循环的一次性算法

function same(arrOne, arrTwo) {
  if (arrOne.length === arrTwo.length) {
    let totalOne = 0;
    let totalTwo = 0;
    for (let x = 0; x < arrOne.length; x++) {
      totalOne += arrOne[x] ** 2;
      totalTwo += arrTwo[x];
    }
    if (totalOne === totalTwo) {
      return true;
    } else return false;
  }
  return false;
}

console.log(same([-1, -2, -3], [4, 1, 9]));
console.log(same([1, 2, 3], [1, 9]));
console.log(same([4, 5, 6], [16, 25, 36]));
console.log(same([1, 2, 3, 2], [9, 1, 4, 4]));

这甚至可以处理第二个数组中的项目不按顺序排列的情况。

© www.soinside.com 2019 - 2024. All rights reserved.