[ CodeWar ] - 006:数组比对

474 阅读2分钟

系列文章

题目

img-01

需求:

  • 对比传入的两个数组
  • 如果 a 数组中每一个子项,在 b 数组中都能找到对应的平方(与顺序无关),则返回 true
  • 否则返回 false

解析

老规矩,先实现,后优化。

把这道题的思路稍微捋一下:

  • 对 a, b 以相同规则进行排序
  • 遍历数组,判断是否每一个子项都满足条件,如果有一个子项不满足则直接 return false
  • 遍历完成之后返回 true
function comp(array1, array2{
  let len, sortRule;
  len = array1.length;
  sortRule = (a, b) => a - b;
  array1.sort(sortRule);
  array2.sort(sortRule);
  for (let i = 0; i < len; i++) {
    if (Math.sqrt(array2[i]) !== array1[i]) {
      return false;
    }
  }
  return true;
}

优化

对于这种对比,我们其实可以转一下思路:

  • 首先还是对 a, b 以相同排序规则排序
  • 然后我们对 a 的每一个子项进行平方操作,生成一个新的 a 数组
  • 将 a, b 转化成字符串,如果两个字符串相等,则满足条件
const comp = (a, b) =>
  a
    .map((i) => Math.pow(i, 2))
    .sort()
    .join() === b.sort().join();

当然,这里完全可以不适用排序来实现这个功能:

  • 通过 Array.every 遍历 a,判断其子项的平方是否在 b 中,返回这个结果即可
const comp = (a, b) => a.every((i) => b.includes(Math.pow(i, 2)));