首页 > 解决方案 > 为什么我的代码在比较 2 个数组时只返回一次 true?

问题描述

我正在尝试解决代码战问题,但我似乎无法让我的代码正常工作。

a1 = [121, 144, 19, 161, 19, 144, 19, 11];
a2 = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19];

Test.assertEquals(comp(a1, a2), true);

  function comp(array1, array2){
     let newArray1Squared = [];
     let newArray1 = a1.sort(function(a, b){
     return a - b;
  });

  newArray1.map(function(num){
    newArray1Squared.push(num*num);
  });

  let newArray2 = a2.sort(function(a, b){
    return a - b;
  });

  for (let i = 0; i<newArray1Squared.length; i++){
    if (newArray1Squared[i] === newArray2[i]){
      return true;
    } else {
      return false;
    }
  }
}

到目前为止,这是我的代码。问题是:

给定两个数组 a 和 b,编写一个函数 comp(a, b)(Clojure 中的 compSame(a, b))检查这两个数组是否具有“相同”元素,是否具有相同的多重性。这里的“相同”意味着 b 中的元素是正方形中的元素,无论顺序如何。

示例 有效数组

a = [121, 144, 19, 161, 19, 144, 19, 11]  
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]

comp(a, b) 返回真,因为在 b 中,121 是 11 的平方,14641 是 121 的平方,20736 是 144 的平方,361 是 19 的平方,25921 是 161 的平方,以此类推。如果我们用正方形来写 b 的元素,那就很明显了:

标签: javascriptalgorithm

解决方案


您可以通过使用对象将每个值的出现计数存储在数组1中来解决它,然后遍历数组2并减少对象中的出现计数,最后遍历对象以查看所有值是否为0。

检查以下:

var a1 = [121, 144, 19, 161, 19, 144, 19, 11];
var a2 = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19];

function comp(array1, array2) {
  var temp = {};

  if(array1.length != array2.length)
    return false;

  for(let a of array1) {
    if(temp[a]) {
      temp[a]++;
    } else {
      temp[a] = 1;
    }
  }

  for(let a of array2) {
    let sqrt = Math.sqrt(a);
    if(temp[sqrt] && temp[sqrt] > 0) {
      temp[sqrt]--;
    } else {
      return false;
    }
  }

  var keys = Object.keys(temp);

  for(let key of keys) {
    if(temp[key] != 0)
      return false;
  }

  return true;
}

console.log(comp(a1, a2));


推荐阅读