Intermediate Algorithm Scripting

1、Sum All Numbers in a Range

我们会传递给你一个包含两个数字的数组。返回这两个数字和它们之间所有数字的和。
最小的数字并非总在最前面。
①扩展语句方法

function sumAll(arr) {
  var a=Math.max(...arr);
  var b=Math.min(...arr);
  var i=a,sum=0;
  while(i>=b){
    sum=sum+i;
    i--;
  }
  return sum;
}

sumAll([1, 4]);

初期写的a=Math.max(arr)方式并不能识别出参数,Math.max()方法需输入每一个参数而不能数组形式,故而运用了扩展语句的方法。
扩展语句

let parts = ['shoulder', 'knees'];

let Tshirts = ['Lee', 'Nike'];


let lyrics = ['head', ...parts, 'and', 'toes'];

// ["head", "shoulder", "knees", "and", "toes"]



let lyrics = ['head', ...parts, 'and', 'toes', ...Tshirts];

// ["head", "shoulder", "knees", "and", "toes", "Lee", "Nike"]

我的理解是可以把数组的元素以参数形式输入。当然或许并不仅仅此作用,扩展语句仅适用于ES6语法。

2、Diff Two Arrays

比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。

function diff(arr1, arr2) {
  var newArr = [];
  // 循环查看arr1中不存在arr2数据的index并导出
  for(var i=0;i

3、Roman Numeral Converter

将给定的数字转换成罗马数字。
所有返回的 罗马数字 都应该是大写形式。

function convert(num) {
  var arry=[];
  var nums=[1000,900,500,400,100,90,50,40,10,9,5,4,1];
  var Roman=['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I'];
  nums.forEach(function(item,index,array){
    while(num>=item){
      arry.push(Roman[index]);
      num=num-item;
    }
  });
 return arry.join('');
}

convert(36);

相比于设立很多if条件获得num的罗马数字,这种数组方式显然更加简单,在if情况多的时候可以借鉴该方法,nums数组为各个特殊情况条件,Roman数组为各个条件对应的情况,通过forEach方法可以将两种数组对应起来。
forEach()方法
语法:

array.forEach(callback(currentValue, index, array){
    //do something
}, this)

array.forEach(callback[, thisArg])

callback 函数会被依次传入三个参数:

数组当前项的值
数组当前项的索引
数组对象本身

4、Pig Latin

把指定的字符串翻译成 pig latin。
Pig Latin 把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 "ay"。如果单词以元音开始,你只需要在词尾添加 "way" 就可以了。

function translate(str) {
  var iarray=['a','e','i','o','u'];
  if(iarray.indexOf(str[0])>=0||iarray.indexOf(str[0].toLowerCase())>=0){
    str=str+'way';
  }
  else{
    var num=0;
    for(var i=1;i

String.substr()方法
返回一个字符串中从指定位置开始到指定字符数的字符

str.substr(start[, length])

start
开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。
length
可选。提取的字符数。

String.substring()方法
返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集

str.substring(indexStart[, indexEnd])

DNA Pairing

DNA 链缺少配对的碱基。依据每一个碱基,为其找到配对的碱基,然后将结果作为第二个数组返回。
Base pairs(碱基对) 是一对 AT 和 CG,为给定的字母匹配缺失的碱基。
在每一个数组中将给定的字母作为第一个碱基返回。
例如,对于输入的 GCG,相应地返回 [["G", "C"], ["C","G"],["G", "C"]]
字母和与之配对的字母在一个数组内,然后所有数组再被组织起来封装进一个数组。

function pair(str) {
  var arr=str.split('');
  var arr1=['A','C'],arr2=['T','G'];
  var array=[];
  for(var i=0;i=0&&num2<0){
      array.push([arr[i],arr2[num1]]);
    }
    else {
      array.push([arr[i],arr1[num2]]);
    }
  }
  return array;
}

pair("GCG");

将对应的情况封装在两个数组中,这样在其中一个出现的索引就是配对数组中的索引,可以使代码更简洁。

String.split() 方法
使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。
str.split([separator[, limit]])
separator:可以是一个字符串或[正则表达式]。 如果纯文本分隔符包含多个字符,则必须找到整个字符串来表示分割点。如果在str中省略或不出现分隔符,则返回的数组包含一个由整个字符串组成的元素。如果分隔符为空字符串,则将str原字符串中每个字符的数组形式返回。
limit:限定返回的分割片段数量。

Missing letters

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

function fearNotLetter(str) {
  var num1=[],num2=[];
  for(var i=0;i

关于charCodeAt()和String.fromCharCode(num)的用法,可以思考一下中间缺失多个字母时的代码。

Sorted Union

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

function unite(arr1, arr2, arr3) {
  var arr=Array.from(arguments);
  var exarr=[];
  for(var i=0;i

之前陷入了比较两个数组提取不重复的元素的死胡同,创建的空白数组作为有无重复元素的标准,没有重复的放入空白数组中这样的方法明显更方便。
关于arguments对象的使用,可以通过arr=Array.from(arguments)这样的方法将其转化为数组。

Sum All Primes

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

function sumPrimes(num) {
  var sum=0;
  for(var i=2;i<=num;i++){
    var isPrime=true;
    for(var j=2;j

熟练运用布尔值作为判断标准可以节省很多不必要的步骤。

Smallest Common Multiple

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

function smallestCommons(arr) {
  arr.sort(function(a,b){
    return a-b;
  });
  function gcd(m,n){
    if(m%n===0){
      return n;
    }
    else{
      return gcd(n,m%n);
    }
  }
  var com=arr[0];
  for(var i=arr[0]+1;i<=arr[1];i++){
    com=com*i/gcd(i,com);
  }
  
  return com;
}


smallestCommons([1,5]);

首先对输入的数组进行排序,最小公倍数就是两个数的乘积除以他们的最大公约数,最大公约数采用的是辗转相除法,即函数gcd()的定义。

Finders Keepers

写一个 function,它遍历数组 arr,并返回数组中第一个满足 func 返回值的元素。举个例子,如果 arr 为 [1, 2, 3],func 为 function(num) {return num === 2; },那么 find 的返回值应为 2。

function find(arr, func) {
  var num=0;
  for(var i=0;i

函数作为函数的参数的使用,该例中的func返回的是true和false。

Steamroller

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

function steamroller(arr) {
  // I'm a steamroller, baby
  var newarray=[];
  function roll(array){
for(var i=0;i

可以使用全局变量,这样只需要定义一个函数就可以,但是在FCC中需要运行多次测试结果,全局变量会引发错误。

Binary Agents

传入二进制字符串,翻译成英语句子并返回。

function binaryAgent(str) {
  var arr=str.split(' ');
  var numcode=[];
  var newstr='';
  for(var i=0;i

String.fromCharCode()方法是静态函数,不能定义新字符串。

Everything Be True

所有的东西都是真的!

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

function every(collection, pre) {
  // Is everyone being true?
  function beTrue(element,index,array){
    return element[pre];
  }
  return collection.every(beTrue);
}

every([{"user": "Tinky-Winky", "sex": "male", "age": 0}, {"user": "Dipsy", "sex": "male", "age": 3}, {"user": "Laa-Laa", "sex": "female", "age": 5}, {"user": "Po", "sex": "female", "age": 4}], "age");

arr.every(callback[, thisArg])
callback 被调用时传入三个参数:元素值,元素的索引,原数组。这种方式会遍历数组的每一个元素,判断其是否符合函数,返回true或者false。

Arguments Optional

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

function add(x) {
  var args = Array.prototype.slice.call(arguments); 
  var result = args.every(function(item) { 
    return Number.isFinite(item); 
  }); 
  if (result === false) { 
    return undefined; } 
  else { 
    if (args.length === 2) { 
      return args[0] + args[1]; 
    } 
    else { 
      var a = args[0]; 
      return function(b) { 
        if (Number.isFinite(b)) { 
          return a + b; 
        } 
        else { 
          return undefined; 
        } }; } } } 
add(2)(3);

一、arguments可以转化成数组的形式,Array.prototype.call(arguments)
二、关于every()的用法

every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再 进行检测。如果所有元素都满足条件,则返回 true。
every() 不会对空数组进行检测。
every() 不会改变原始数组。
三、Number.isFinite()和Number.isNaN()
和全局的 isFinite()(该全局 isFinite() 函数用来判断被传入的参数值是否为一个有限数值(finite number)。在必要情况下,参数会首先转为一个数值。) 函数相比,这个方法不会强制将一个非数值的参数转换成数值,这就意味着,只有数值类型的值,且是有穷的(finite),才返回 true。
isNaN() 函数用来确定一个值是否为NaN ,必要时转化参数为数值再验证,Number.isNaN()不会强制将参数转换成数字,只有在参数是真正的数值类型,且值为 NaN 的时候才会返回 true

Friendly Date Ranges

让日期区间更友好!

把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式。

易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1).

记住不要显示那些可以被推测出来的信息: 如果一个日期区间里结束日期与开始日期相差小于一年,则结束日期就不用写年份了;在这种情况下,如果月份开始和结束日期如果在同一个月,则结束日期月份也不用写了。

另外, 如果开始日期年份是当前年份,且结束日期与开始日期小于一年,则开始日期的年份也不用写。

function makeFriendlyDates(arr) {
  var prearr=arr[0].split('-');
  var beharr=arr[1].split('-');
  var month=['January','February','March','April','May','June','July','August','September','October','November','December'];
  var date=['st','nd','rd'];
  var result,Numpre=parseInt(prearr.join(''),10),Numbeh=parseInt(beharr.join(''),10);
  //更改月份日期
  function change(array){
    var newarr=[];
    newarr[0]=month[parseInt(array[1])-1];
    var a=parseInt(array[2]);
    var reg=/[^1][1-3]$/g;
  if(reg.test(array[2])){
    var b=array[2].match(reg);
    if(b>10){
    newarr[1]=a+date[b[0][1]-1];
  }
    else{
      newarr[1]=a+date[b-1];
    }
  }
    else{
      newarr[1]=a+'th';
    }
    if(array[0]=='2017'){
      return newarr;
    }
    else{
    newarr[1]=newarr[1]+',';
    newarr[2]=array[0];
    return newarr;
    }
  }
  var pre=change(prearr);
  var beh=change(beharr);
//格式不对的输入,相同的日期
  if(Numpre-Numbeh>0){
    result=undefined;
  }
  else if(Numpre===Numbeh){
    
      result=[pre.join(' ')];
    
  }
  else if(prearr[0]==beharr[0]){
    //年份相同,月份相同和不相同的情况
    if(prearr[1]===beharr[1]){
     result=[pre.join(' '),beh[1]];
    
    }
    else{
      result=[pre.join(' '),beh[0]+' '+beh[1].replace(/,/,'')];
   
    }
  }
//年份不相同的情况,相差小于1年,相差大于一年
  else if(Numbeh-Numpre<10000){
     result=[pre.join(' '),beh[0]+' '+beh[1].replace(/,/,'')];
    
  }
  else{
     result=[pre.join(' '),beh.join(' ')];
 
  }
  return result;
}

makeFriendlyDates(["2008-10-31", "2009-10-31"]);

你可能感兴趣的:(Intermediate Algorithm Scripting)