Intermediate Algorithm Scripting

坚持又把FCC中级算法刷了一遍,很有价值。尤其是很多思维方式的提升,以及正则的运用也更加熟练。题目又点多21道。不一定全写,因为有的题太简单,也没有什么知识点可讲。但序号还说按照题目本身来给,望见谅。(解析也不想写,怪自己太懒...)有疑惑欢迎留言喔!
2.Diff Two Arrays

比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。
["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"] 应该返回 ["diorite", "pink wool"] [1, "calf", 3, "piglet"], [1, "calf", 3, 4] 应该返回 ["piglet", 4]

//解析:把两个数组先合并,过滤掉原数组都存在的元素
function diffArray(arr1,arr2) {
  return arr1.concat(arr2).filter(e => !(arr1.includes(e) && arr2.includes(e)));
}

3.Roman Numeral Converter

将给定的数字转换成罗马数字

function convertToRoman(num) {
 var lookup ={M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};
 var romanStr = "";
 for (var i in lookup){
    while (num >= lookup[i]){
      romanStr+=i;
      num -= lookup[i];
    }
 }
 return romanStr;
}

4.Where art thou

写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。

function whatIsInAName(collection, source) {
  var arr = [];
  for(var i = 0;i < collection.length;i++){
      var flag = true;
      for(var key2 in source){
          if (source[key2] !== collection[i][key2]){
              flag = false;
          }
      }
      if(flag){
          arr.push(collection[i]);
      }
  }
  return arr;
}

5.Search and Replace

使用给定的参数对句子执行一次查找和替换,然后返回新句子。
第一个参数是将要对其执行查找和替换的句子。
第二个参数是将被替换掉的单词(替换前的单词)。
第三个参数用于替换第二个参数(替换后的单词)。
注意:替换时保持原单词的大小写。例如,如果你想用单词 "dog" 替换单词 "Book" ,你应该替换成 "Dog"。

function myReplace(str, before, after) {
  var newstr = before[0] !== before[0].toUpperCase() ? after :          (after[0].toUpperCase()+after.slice(1)); 
  return str.replace(new RegExp(before), newstr);
}

6.Pig Latin

把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 "ay"。
如果单词以元音开始,你只需要在词尾添加 "way" 就可以了。

function translatePigLatin(str) {
    str = str.replace(/^([aeiou][a-z]*)$/gi, "$1way"); // 表示,如果开头为aeiou,那么尾部加上way
    str = str.replace(/^([^aeiou]+)([a-z]*)$/gi, "$2$1ay");// 如果开头为辅音,第二部分——第一部分——ay
    return str;
}

8.Missing letters

从传递进来的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中,返回 undefined。

function fearNotLetter(str) {
  if(str.charCodeAt(str.length-1) - str.charCodeAt(0) === str.length-1){
    return undefined;
  }else{
    for(var i = 0; i < str.length; i++){
      if(str.charCodeAt(i+1) - str.charCodeAt(i) !== 1){
        return String.fromCharCode(str.charCodeAt(i)+1);
      }
    }
  }
}

10.Sorted Union

写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。
换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值。
非重复的数字应该以它们原始的顺序排序,但最终的数组不应该以数字顺序排序。

function uniteUnique(...arr) {
  return arr.reduce(function(prev,next){
    return prev.concat(next.filter(e => !prev.includes(e)));
  });
}

12.Spinal Tap Case

将字符串转换为 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也就是以连字符连接所有小写单词。

function spinalCase(str) {
  str = str.replace(/([a-z])([A-Z])/g, '$1 $2');
  return str.replace(/\s|_/g, '-').toLowerCase();
}

13.Sum All Odd Fibonacci Numbers

给一个正整数num,返回小于或等于num的斐波纳契奇数之和。
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。
提示:此题不能用递归来实现斐波纳契数列。因为当num较大时,内存会溢出,推荐用数组来实现。

function sumFibs(num) {
  var prev = 0, next = 1,  n = 1,  res = 0;
  while(next <= num){
    if(n % 2 !== 0){
      res += n;
    }
    n = prev + next;
    prev = next;
    next = n; 
  }
  return res;
}

14.Sum All Primes

求小于等于给定数值的质数之和。
只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。
给定的数不一定是质数。

function sumPrimes(num) {
  var res = 0;
  for(var n = 1; n <= num; n++){
    for(var m = 2; m < n; m++){
      if(n % m === 0){
        break;
      }
    }
    if(n === m){
      res +=m;
    }
  }
  return res;
}

15.Smallest Common Multiple

找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。

function smallestCommons(arr) {
  var temp = [];
  var min = Math.min(arr[0],arr[1]);
  var max = Math.max(arr[0],arr[1]);
  for(var i = min; i <= max; i++) {
    temp.push(i);
  }
  var gcd = function(a,b) {
    return b ? gcd(b, a % b) : a;
  };
  
  return temp.reduce(function(prev,cur) {
    return prev*cur/gcd(prev,cur);
  });
}

17.Drop it

从前面删除数组第一个参数的元素,直到第二个参数返回true。
第二个参数func是一个函数,用于测试数组的第一个元素,以决定是否应该删除它。
返回数组的其余部分,否则返回一个空数组。

function dropElements(arr, func) {
  return arr.slice(arr.findIndex(func) >= 0 ? arr.findIndex(func) : arr.length, arr.length);
}

18.Steamroller

对嵌套的数组进行扁平化处理。你必须考虑到不同层级的嵌套。

function steamrollArray(arr) {
  return arr.reduce(function(prev, next){
    return prev.concat(Array.isArray(next) ? steamrollArray(next) : next);
  }, []);
}

19.Everything Be True

如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真。函数返回ture。反之,返回false。

function truthCheck(collection, pre) {
  return collection.every(function(e){
    return e[pre];
  });
}

20.Arguments Optional

创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。
例如,add(2, 3) 应该返回 5,而 add(2) 应该返回一个 function。
调用这个有一个参数的返回的 function,返回求和的结果:
var sumTwoAnd = add(2);
sumTwoAnd(3) 返回 5。
如果两个参数都不是有效的数字,则返回 undefined。

function addTogether() {
  var args = Array.from(arguments);
  return args.some(n => typeof n !== 'number') ? undefined 
         : args.length > 1 ?
         args.reduce((prev, next) => prev += next, 0) : (n) => typeof n === "number" ? 
         n + args[0] : undefined;
}
addTogether(2,3);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,148评论 0 4
  • 1、区间求值算法(Sum All Numbers in a Range) 我们会传递给你一个包含两个数字的数组。返...
    Iris_mao阅读 1,528评论 0 2
  • 文/弋逝水 ——洒脱如叔夜,越名教而任自然。 也许,大多人对嵇康的熟悉,多是片面不祥的。 大多是从绝响《广陵散》得...
    高白牧阅读 642评论 0 1
  • 又到年底,是休年假的时候了。 北方天寒地冻加雾霾,海南气候好,可最近老有台风。 云南咋样?同学。 云南?不错。 待...
    ibolomi阅读 382评论 1 0