code war 天天一练(2)

 

Instruction

看题就要看一会,大致意思就是:比较数组a是否和数组b拥有相同的元素。这个‘相同’是指不论顺序,数组a中数字的平方一一对应数组b中的数字。

一开始我的解决方案是这样的:

 1 function comp(array1, array2){
 2         var arr1 = array1 || '';
 3         var arr2 = array2 || '';
 4         if(arr1.length === 0 || arr2.length === 0) return false;
 5         if(arr1.length != arr2.length) return false;
 6         arr1.map(t=>t*t).forEach(function(s){
 7             if(arr2.indexOf(s)){
 8                 arr2.splice(arr2.indexOf(s),1)
 9             }else{
10                 return false;
11             }
12         });
13         return true;
14     }

但是报错了。因为:

1,arr2.indexOf(s)这里没处理好,当找到的下标为0时,会返回false。

2,在forEach中,return false是跳出数组的forEach循环,接着运行comp接下来的方法,而不是跳出comp函数。

所以,可以将以上方法改进一下,变成:

function comp(array1, array2){
  var flag = true;
  if(array1 == null || array2 == null) return false;
  array1.map(t=>t*t).forEach(function(s){
    if(array2.indexOf(s) >= 0){
      array2.splice(array2.indexOf(s),1)
    }else{
      flag = false;
    }
  });
  return flag;
}

这样测试全部通过。可是总觉得太迂回了点,效率不那么高,却找不到好的思路,只好去学习网友的思路,于是我找到了:JS比较两个数组是否相等,是否拥有相同元素

这里面给我提供了一个新的思路:与其去一一对比,删除array2中的元素,何不重新排序后,简化成字符串作对比?这样就不存在数组增减的问题了

于是我修改了我的代码:

function comp(array1, array2){
        if(array1 == null || array2 == null) return false;
        return flag = array1.map(t=>t*t).sort().toString() === array2.sort().toString() ? true : false; 
}

答案区里的最受好评的方法思路也差不多,只是在实践上更好:

function comp(array1, array2) {
  if(array1 == null || array2 == null) return false;
  array1.sort((a, b) => a - b); array2.sort((a, b) => a - b);
  return array1.map(v => v * v).every((v, i) => v == array2[i]);
}

因为sort()排序不一定是稳定的,这里说明一下sort的语法。

arr.sort(compareFunction):compareFunction是可选的,用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序。

例如,数字比大小时,9出现在80之前,但这里比较时数字会先被转换为字符串,所以‘80’比‘9’要靠前。

如果指明compareFunction,那么数组将会按照调用该函数的返回值来排序。即a和b是两个将要被比较的元素:

  • 如果compareFunction(a,b)小于0,那么a会被排列到b之前。
  • 如果compareFunction(a,b)等于0,a和b的相对位置不变。
  • 如果compareFunction(a,b)大于0,b会被排列到a之前。
  • compareFunction(a,b)必须总是对相同的输入返回相同的比较结果,否则排序的结果将会是不确定的。

所以上面解决方案采用了 sort((a, b) => a - b)。

另外这里还用到了arr.every(callback[, thisArg])。every()方法测试数组的所有元素是否都通过了指定函数的测试。

every()方法为数组中的每个元素执行一次callback函数,直到它找到一个使callback返回false的元素。如果发现一个这样的元素,every方法将会立即返回false。否则,callback为每一个元素返回true,every就会返回true。

用了every方法,就不用和我一样傻傻的做比较判断真假了

 

ps:

说到every,也要说一说some方法,some和every都是在需要break的场景下,有相同的作用,只不过两者有一个不同:

  • every:碰到return false的时候,循环终止
  • some:碰到return true的时候,循环终止

 

 附: codewar-该习题练习地址

转载于:https://www.cnblogs.com/gong-zhu/p/7054374.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值