【问题标题】:Why is my code only returning true one time in comparing 2 arrays?为什么我的代码在比较 2 个数组时只返回一次 true?
【发布时间】:2020-04-08 03:21:23
【问题描述】:

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

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 的元素写成正方形,那就很明显了:

【问题讨论】:

  • 嗨 charlieyin,如果此页面上的答案解决了您的问题,请考虑将其标记为已接受。谢谢

标签: javascript algorithm


【解决方案1】:

在您的for 循环中,您目前只比较已排序数组中的第一项。将不考虑除最低值之外的任何项目,因为一旦比较了两个最低值,该函数将return true 或return false。

排序后,使用every 检查一个数组中的每个元素是否与另一个匹配:

const a1 = [121, 144, 19, 161, 19, 144, 19, 11];
const a2 = [11 * 11, 121 * 121, 144 * 144, 19 * 19, 161 * 161, 19 * 19, 144 * 144, 19 * 19];
console.log(comp(a1, a2));

function comp(array1, array2) {
  if (array1.length !== array2.length) {
    return false;
  }
  const arr1Sq = array1
    .map(num => num ** 2)
    .sort((a, b) => a - b);
  array2.sort((a, b) => a - b);
  return arr1Sq.every((num, i) => array2[i] === num);
}

.sort 具有O(n log n) 的复杂性,不过。对于较大的输入,最好使用对象或 Map 来收集出现次数,整体复杂度为 O(n):

const a1 = [121, 144, 19, 161, 19, 144, 19, 11];
const a2 = [11 * 11, 121 * 121, 144 * 144, 19 * 19, 161 * 161, 19 * 19, 144 * 144, 19 * 19];
console.log(comp(a1, a2));

function comp(array1, array2) {
  if (array1.length !== array2.length) {
    return false;
  }
  const counts = {};
  for (const item of array1) {
    const squared = item ** 2;
    counts[squared] = (counts[squared] || 0) + 1;
  }
  for (const item of array2) {
    counts[item]--;
    if (counts[item] === -1 || Number.isNaN(counts[item])) {
      return false;
    }
  }
  return true;
}

【讨论】:

    【解决方案2】:

    该函数只被调用一次,并在使用return语句时结束。您只检查数组的第一个值。

    您需要重构您的函数以在外部使用 for 循环并在每个循环中运行测试。

    我认为这可行:

    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];
    
    
    let newArray1 = a1.sort(function(a, b){
      return a - b;
    });
    let newArray2 = a2.sort(function(a, b){
        return a - b;
    });
    
    for (let i = 0; i<newArray1.length; i++){  
        console.log(comp(newArray1[i], newArray2[i])); //Run the test for every value in the array
    }
    
    function comp(value1, value2){
      let squareValue1 = value1*value1; 
      return squareValue1 === value2;
    }

    【讨论】:

      【解决方案3】:

      你可以通过使用一个对象来解决它,将每个值的出现计数存储在数组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));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多