【问题标题】:How do I see if each number within one array is found squared within another array?如何查看一个数组中的每个数字是否在另一个数组中找到平方?
【发布时间】:2020-07-03 09:12:48
【问题描述】:

给定两个数组 a 和 b 写一个函数 comp(a, b) (compSame(a, b) 在 Clojure 中)检查两个数组是否“相同” 元素,具有相同的多重性。 “相同”在这里意味着 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 的平方,以此类推。

首先,我只想检查每个项目并测试平方版本是否存在于另一个数组中。这是我的代码:

function comp(array1, array2){
  return array2.every((item)=>{
    let a = array1.indexOf((item ** 2));
    if(a >=0){
      return true;
    } else{
      return false;
    }
  })


}


console.log(comp([121, 144, 19, 161, 19, 144, 19, 11], [121, 14641, 20736, 361, 25921, 361, 20736, 361]));

这个例子当然应该返回true。我的代码看起来很基本,所以我不确定为什么它不起作用。此外,如果我为第二个数组放置一个空数组,它会返回 false。

【问题讨论】:

  • a = [11,11],b = [121] 的答案应该是什么?我想它应该是false,因为它确实有121,但它只出现一次。

标签: javascript arrays algorithm


【解决方案1】:

使用everyincludes,这可以用一个简单的单行来编写:

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

const comp = (a, b) => a.length === b.length && a.every(value => b.includes(value ** 2))

console.log(comp(a, b))

非常明确,这个函数检查两个数组是否具有相同的长度,以及a squared 的每个值是否都包含在b 中。

【讨论】:

  • includes() 使它成为 O(n^2)。
【解决方案2】:

您可以将Set 替换为array2 并检查array1 的每个产品。

function comp(array1, array2) {
    const set2 = new Set(array2);
    return array1.every(v => set2.has(v * v));
}

console.log(comp([121, 144, 19, 161, 19, 144, 19, 11], [121, 14641, 20736, 361, 25921, 361, 20736, 361]));

【讨论】:

  • 该问题要求相同的多重性Set 丢失此信息。
【解决方案3】:

使用 every 和 a set 删除重复项

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

function compare(a,b){
 a=[...new Set(a)]
 b=new Set(b)
 
 return a.every(x=>b.has(x*x))
   
}

console.log(compare(a,b))

【讨论】:

    【解决方案4】:

    您的代码几乎可以用于测试用例。你只是在里面交换了数组:

    function comp(array1, array2){
      return array1.every((item)=>{
        let a = array2.indexOf((item ** 2));
        if(a >=0){
          return true;
        } else{
          return false;
        }
      })
    }
    

    虽然如果我理解正确,即使数组具有不同的长度,或者如果第二个数组的元素不是第一个元素的多重性,只要第一个数组有一些多重性,这将返回 true第二个:

    console.log(comp([2,4,4,2], [4,16]));
    // -> true
    console.log(comp([2,4], [4,16, 536]));
    // -> true
    

    所以,要忠实于前提,并且要很多更有效地避免 indexOf 或包含:

    function comp2(A, B){
      if(A.length != B.lengt) return false;
      
      A.sort((a, b) => a-b);
      B.sort((a, b) => a-b);
      
      return A.every((a, i)=>{
        const b = B[i];
        if(a ** 2 == b){
          return true;
        } else{
          return false;
        }
      })
    }
    
    console.log(comp2([2,4,4,2], [4,16]));
    // -> false
    console.log(comp2([2,4], [4,16, 536]));
    // -> false
    

    游乐场:https://jsfiddle.net/alotropico/9ukmL5g3/13/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多