Freecodecamp 高级算法(个人向)

freecodecamp 高级算法地址戳这里

freecodecamp的初级和中级算法,基本给个思路就能完成,而高级算法稍微麻烦了一点,所以我会把自己的解答思路写清楚,如果有错误或者更好的解法,欢迎留言。

Validate US Telephone Numbers

如果传入字符串是一个有效的美国电话号码,则返回 true.

简单来说,美国号码的规则就是,国家代码(必须为1),然后就是3,3,4的数字组合,前三个数字可以用括号包起来。另外就是间隔使用空格或者“-”。

因为输入值肯定是字符串,规则也较多,所以考虑用正则做。

先贴代码:

function telephoneCheck(str) {
  // Good luck!
  var reg=/^(1\s?)?\(?\d{3}\)?(\s|-)?\d{3}(\s|-)?\d{4}/;   //正则规则

  var index1=str.indexOf("(");
  var index2=str.indexOf(")");   //查询到两个括号

  if( (index1!=-1 && index2!=-1) || (index1==-1 && index2==-1) ){   //存在双括号或者没有括号
    if( index2!=index1 && index2-index1!=4 ){  //如果存在双括号,且序号间的字符有3个
      return false;
    }
    var str2=str.replace(/[\(\)\s-]/g,"");  //将括号和空格和“-”全局替换成空,便于统计数字长度
    if( str2.length==11 && str2.substr(0,1)!=1 ){
      return false;
    }

  }else{
      return false;
  }

  return reg.test(str);
}

telephoneCheck("27576227382");

当首次尝试直接匹配号码的时候我们发现不行,因为我们没办法同时匹配到双括号,正则规则存在一些盲点,这些盲点首先就是双括号的问题,再有就是长度问题,对于超出长度的字符我们没有匹配验证的能力,这就需要我们用js进行一些弥补。

我的做法,首先验证是否有双括号,同时有或者同时没有皆可;如果只有一个,返回false。接着在同时有或者同时没有双括号里面追加两个判断,如果有双括号,那么两个括号之间的字符一定是三个,否则返回false,如果确实返回3个,那我们也不用进行过多的判断,因为正则里已经写好了。接着就是通过replace将一切干扰元素去掉,验证一下字符串的长度有没有超出11;当长度为11时,第一个数字是不是1。完成了这些用来完善的判断,最后进行一下正则的匹配就可以了。

Symmetric Difference

创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) ( or )数组

输入的数组可能会是多个,而题目的要求是按顺序两两处理。也就是说,我们把前两个数组各自独有的元素组成新数组后,再和第三个数组进行处理,以此类推,最终会返回一个数组。这种模式让我们想到了数组的reduce方法,前两个处理出一个结果,处理出的结果再和下一个进行处理,直到最后得到一个结果。

所以主体函数的最后只要使用reduce就可以了,那么目前的问题就是解决两个数组之间如何消去所有的相同元素,然后返回一个排好序的新数组。因为一个数组当中都可能存在重复的元素,如果只是两个数组都删除相同的,可能还会删不干净。

我的思路是这样的,既然我们的目标只有值,而不在乎数量,所以一个开始就可以对两个数组分别进行一次去重,然后就是两个删除一个相同元素然后拼接排序。我这里呢,偷了个懒,用的还是去重的函数,等于省了一个函数。

function sym(args) {
  var arrs=[];
  for(var a of arguments){
    arrs.push(a);
  }
  var res=arrs.reduce(function(a,b){
    a=del(a);
    b=del(b);  //数组分别处理
    var arr=a.concat(b);
    return del(arr,true);  //拼接成一个大数组后,再进行一次处理
  });

 return res;
}

function del(arr,flag){   //排序and去重   flag为true表示删干净,否则留一个
  var start,end;
  arr.sort(function(a,b){  //数组由小到大排序
    return a-b;
  });
  for(var i=0;i<arr.length;i++){
    if(arr[i]==arr[i+1]){  //发现重复
      start=(start===undefined)?i:start;  //start为重复的起始位置
      end=i+1;           //end为重复的结束位置
    }else{
      if( end && end==i ){  //如果存在重复,即end有值,按照flag对数组进行处理。
        if( flag ){
          arr.splice(start,end-start+1);
          i=i-(end-start+1);
        }else{
          arr.splice(start,end-start);
          i=i-(end-start);
        }
        start=undefined;  //没有重复了,start要还原
      }
    }
  }

  return arr;

}
sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]);

未完待续。。。

时间: 2024-10-12 00:01:16

Freecodecamp 高级算法(个人向)的相关文章

No repeats please(freecodecamp高级算法6)

把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a). function permAlone(str) { //使用正则匹配连续重复 var regex = /(.)\1+/g;//括号代表分组,\1表示获得和第一个分组里完全相同的内容

Map the Debris(freecodecamp高级算法8)

Map the Debris 返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: avgAlt}. 以轨道高度计算轨道周期的公式 a:轨道的半长轴(m),μ = GM 求得的值应该是一个与其最接近的整数,轨道是以地球为基准的. 地球半径是 6367.4447 kilometers, 地球的GM值是 398600.4418, 圆周率为Math.PI function orbitalPeri

面试高级算法梳理笔记

面试高级算法梳理笔记 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系列,旨在: 梳理算法逻辑 探索优化思路 深入代码细节 1.2 目录 原文首发于个人博客Jennica.Space,按算法难度划分为初中高三个级别,详细目录及链接如下: 初级篇 穷竭搜索 贪心 动态规划 数据结构 图论 数论 中级篇 二分搜索 常用技巧 数据结构(二) 动态规划(二) 网络流 计算几何 高级篇 数论(二) 博弈论 图论(二) 常用技巧(二) 智慧搜索 分治 字符串 1.3 题解 配套习题及详解同步发

【高级算法】禁忌搜索算法解决3SAT问题(C++实现)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46440389 近期梳理,翻出了当年高级算法课程做的题目.禁忌搜索算法解决3SAT问题. 吐槽:数学符号怎样在编辑器里打出来啊,为了保留符号,我直接截图了. 1 SAT问题描写叙述 定理4.4.1: 赋值v为使CNF可满足的充要条件是f(x1,x2,-,xm)达到最小值0. 2  禁忌搜索算法 禁忌搜索算法是在局部搜索的过程中引进了贪心选择机制.并利用禁忌表改动邻域,通过构造的候选

js 高级算法 - 动态规划

主要是看了<数据结构与算法>有所感悟,虽然这本书被挺多人诟病的,说这有漏洞那有漏洞,但并不妨碍我们从中学习知识. 其实像在我们前端的开发中,用到的高级算法并不多,大部分情况if语句,for语句,swith语句等等,就可以解决了.稍微复杂的,可能会想到用递归去的解决. 但要注意的是递归写起来简洁,但实际上执行的效率并不高. 我们再看看动态规划的算法: 动态规划解决方案从底部开始解决问题, 将所有小问题解决掉, 然后合并成一个整体解决方案, 从而解决掉整个大问题 . 实例举例  (计算斐波那契数列

【高级算法】遗传算法解决3SAT问题(C++实现)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46910079 1 SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前,先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使A为真. 显然,如A为真,则CNF的每一个子句中必有一个命题变元为1(真). 2 遗传算法

高级算法——贪心算法(找零问题)

function makeChange(origAmt, coins) {//贪心算法——找零问题 var remainAmt ; if (origAmt % .25 < origAmt) { coins[3] = parseInt(origAmt / .25); remainAmt = origAmt % .25; origAmt = remainAmt; } if (origAmt % .1 < origAmt) { coins[2] = parseInt(origAmt / .1); r

高级算法——贪心算法(背包问题)

贪心算法不能用来解决离散物品问题的原因是我们无法将“ 半台电视” 放入背包. 规则是按照物品价值高低顺序放入背包. function ksack(values, weights, capacity) { var load = 0; var i = 0; var v = 0; while (load < capacity && i < weights.length) { if (weights[i] <= (capacity - load)) { v += values[i

链表高级算法——2

一.判断两个链表是否相交 int CheckCross(pLinkList list1, pLinkList list2) //判断链表是否相交 { assert(list1); assert(list2); pLinkNode cur1 = list1->pHead; pLinkNode cur2 = list2->pHead; if ((NULL==list1->pHead)||(NULL==list2->pHead)) { return -1; } while (NULL!=