如何判断两个数组是否相等?

  在实际开发中自创的一个小算法

Posted by 陈剑 on May 7, 2018

前言

最近写的一个项目中,碰到了一个很有意思的问题,并自己琢磨着写了一个自认很精妙的算法,在此分享给大家。 首先这个软件是一款用户可以自己录入题目,生成试卷,别人可以作答的软件,所以用户在录入题目时,我设置了一个数组变量correctAnswerList[],当用户录入完题目后会勾选正确选项A、B、C、D,每勾选一个选项,我就push进相应的A、B、C、D元素。

因为题目有三种类型,单选多选和判断,故数组有三种形式:

单选为[“A”]、[“B”]、[“C”]、[“D”]这种类型,即每个数组有且仅有一个元素。

多选为[“A”,”C”]、[“A”,”C”,”D”]、[“A”,”B”,”C”,”D”]这种类型,即每个数组有2到4个元素。

判断为[“A”]、[“B”]这种类型,A为对,B为错,即每个数组仅有一个元素,并且只有两种可能A或B。

这里还要再强调一点,用户不会顺着你ABCD的顺序去勾选,故correctAnswerList有可能为[“A”,”C”],也可能是[“C”,”A”]。

以上为题目录入时标答案的录入规则,同样用户作答时的用户答案也是同理,我设置了一个变量数组userAnswerListp[],用户勾选答案后也是push进去A、B、C、D。

实现思路

刚开始固然是想当然的直接将数组转换为字符串,然后判断两个字符串是否相等,但是刚才强调了,[“A”,”C”]和[“C”,”A”]转换完字符串后,是完全不同的,但是实际上按照逻辑是一样的,固这一解决方案否定。

其次便想到最多也就是四个元素,依次遍历耗费的资源也不是很多,那就for它们吧。

首先当然不能直接上来就for,解决一个问题时,首先要解决问题中一眼就能看出来的问题,其次再解决需要计算的问题,对问题分层,这样可以使资源占用最少。

而这个问题中,判断两个数组是否相等,一眼就可以看出的问题即是,两个数组的长度,如果两个数组的长度都不相等,那更不可能全等了。

所以首先判断两个数组长度是否相等,为方便我们设定两个数组为array1和array2,若不相等,则直接令answerReslut为false。

 if (array1.length != array2.length){
      answerReslut=false;
  }

其次就是要判断两个数组长度相等的情况,这里很多人拿到题目时,首先想到的是分情况讨论,即单选、多选和和判断,每个情况写一种判断方法,其实大可不必,以下方法对这三种题目类型是通解。

首先数组长度相等,有以下几种情况: [“A”]和[“C”]

[“A”,”C”]和[“C”,”A”]

[“A”,”C”]和[“B”,”D”]

[“A”,”C”,”D”]和[“B”,”D”,”C”]

[“A”,”B”,”C”,”D”]和[“D”,”C”,”B”,”A”]

可见存在两种情况,即只有一个元素时,数组内元素只有相等和不相等的情况。

有一个以上的元素时,又分为三种情况,即数组内元素全都不等,有个别相等,以及全都相等但是顺序不同。

嗯…情况有点多,但是如果这时候用了if语句….那就死绝了。先直接上我的代码,然后再剖析。

  var correctNumber=0;
  for (var i = 0; i < array1.length;i++){
    for (var j = 0; j < array2.length;j++){
      if (array1[i] == array2[j]){
        correctNumber++;
      }
    }
  }
  if (array1.length == correctNumber){
    answerReslut = true;
  }
  else{
    answerReslut = false;
  }

首先我设置一个变量correctNumber,初始值为0,然后写两个for循环嵌套,去遍历这两个数组。

首先执行第一个for循环,i为0,进入第二个for循环,j为0,然后是用array1[0]依次和array2的第一个至最后一个元素进行对比,如果和其中一个元素一样,则令correctNumber自增1,直至第二个for循环结束。

然后再执行第一个for循环,i为1,进入第二个for循环,再依次和array2的元素进行对比,循环往复直至结束。

然后判断array1的长度和correctNumber是否相等,如果相等则将answerReslut赋值为true,反之则反。

也就是说,只要array1的一个元素和array2的一个元素一样,则令correctNumber+1,最后全部循环完,如果array1和array2的元素一样(不论顺序是否打乱),最终correctNumber的大小必然是array1的长度,只要有一个不一样,则两者不等。

以上就是我的解决方法,当然肯定也有比我更好的方法,欢迎大家提出建议,以上答案仅供参考。