freeCodeCamp 中級(jí)javascript算法體驗(yàn)

1席纽、區(qū)間求值算法(Sum All Numbers in a Range)

我們會(huì)傳遞給你一個(gè)包含兩個(gè)數(shù)字的數(shù)組纽疟。返回這兩個(gè)數(shù)字和它們之間所有數(shù)字的和瞎嬉。
最小的數(shù)字并非總在最前面蜕琴。
對(duì)你有幫助的資源:
Math.max() 函數(shù)返回一組數(shù)中的最大值挣轨。
Math.min() 函數(shù)返回一組數(shù)中的最小值串前。

//思路:先找出最大值和最小值瘫里,循環(huán)算和
function sumAll(arr) {
  var sum = 0;
  var min = Math.min(arr[0],arr[1]);
  var max = Math.max(arr[0],arr[1]);
  for(var i = min;i<=max;i++){
    sum+=i;
  }
  return sum;
}
sumAll([1, 4]);
2、找出數(shù)組間差異算法(Diff Two Arrays)

比較兩個(gè)數(shù)組荡碾,然后返回一個(gè)新數(shù)組减宣,該數(shù)組的元素為兩個(gè)給定數(shù)組中所有獨(dú)有的數(shù)組元素。換言之玩荠,返回兩個(gè)數(shù)組的差異漆腌。
對(duì)你有幫助的資源:
Array.indexOf() 方法返回在數(shù)組中可以找到一個(gè)給定元素的第一個(gè)索引贼邓,如果不存在,則返回-1闷尿。
Array.concat() 方法用于合并兩個(gè)或多個(gè)數(shù)組塑径。此方法不會(huì)更改現(xiàn)有數(shù)組,而是返回一個(gè)新數(shù)組填具。

//思路:分別對(duì)比兩個(gè)數(shù)組中的元素统舀,不同的加入新數(shù)組中,然后將不同的元素連接成一個(gè)新數(shù)組
function diff(arr1, arr2) {
  var newArr = [];
  var arr3 = [];  
  for (var i=0;i<arr1.length;i++) {  
    if(arr2.indexOf(arr1[i]) === -1)     //對(duì)比
      arr3.push(arr1[i]);  
  }  
   var arr4 = [];  
  for (var j=0;j<arr2.length;j++) {  
    if(arr1.indexOf(arr2[j]) === -1)    //對(duì)比
      arr4.push(arr2[j]);  
  }  
   newArr = arr3.concat(arr4);     //連接
  // Same, same; but different.
  return newArr;
}
diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);
3劳景、數(shù)字轉(zhuǎn)羅馬數(shù)字(Roman Numeral Converter)

所有返回的 羅馬數(shù)字 都應(yīng)該是大寫形式誉简。
對(duì)你有幫助的資源:
Array.prototype.forEach() 方法對(duì)數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)。

//思路:將數(shù)字對(duì)應(yīng)的羅馬數(shù)字建立對(duì)應(yīng)的數(shù)組盟广,將數(shù)字?jǐn)?shù)組循環(huán)跟要轉(zhuǎn)化的數(shù)字進(jìn)行對(duì)比闷串,找出對(duì)應(yīng)區(qū)間對(duì)應(yīng)的羅馬數(shù)字
function convert(num) {
 var nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1];  
  var romans =["m","cm","d","cd","c","xc","l","xl","x","ix","v","iv","i"];  
  var str = '';  
  nums.forEach(function(item,index,array){    //循環(huán)對(duì)比要轉(zhuǎn)化的數(shù)字
    while(num >= item){  
      str += romans[index];    //轉(zhuǎn)化成對(duì)應(yīng)的羅馬數(shù)字
      num -= item;  
    }  
  });  
 return str.toUpperCase();   //全部轉(zhuǎn)化成大寫
}
convert(36);
4、對(duì)象搜索算法(Where art thou)

寫一個(gè) function筋量,它遍歷一個(gè)對(duì)象數(shù)組(第一個(gè)參數(shù))并返回一個(gè)包含相匹配的屬性-值對(duì)(第二個(gè)參數(shù))的所有對(duì)象的數(shù)組烹吵。如果返回的數(shù)組中包含 source 對(duì)象的屬性-值對(duì),那么此對(duì)象的每一個(gè)屬性-值對(duì)都必須存在于 collection 的對(duì)象中桨武。
例如肋拔,如果第一個(gè)參數(shù)是[{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二個(gè)參數(shù)是{ last: "Capulet" }呀酸,那么你必須從數(shù)組(第一個(gè)參數(shù))返回其中的第三個(gè)對(duì)象萍程,因?yàn)樗俗鳛榈诙€(gè)參數(shù)傳遞的屬性-值對(duì)擅笔。
對(duì)你有幫助的資源:
Object.keys() 方法會(huì)返回一個(gè)由一個(gè)給定對(duì)象的自身可枚舉屬性組成的數(shù)組撕蔼,數(shù)組中屬性名的排列順序和使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致 (兩者的主要區(qū)別是 一個(gè) for-in 循環(huán)還會(huì)枚舉其原型鏈上的屬性)靶庙。
語法

function where(collection, source) {
  var arr = [];
  var arrSource=Object.keys(source);//把source的屬性轉(zhuǎn)化為數(shù)組  
  var i='',j=0;
  for(i in collection){//循環(huán)collection的元素
    var count=0;
    for(j=0;j<arrSource.length;j++){//針對(duì)source的屬性進(jìn)行循環(huán),查找這個(gè)collection元素中是否有指定的source的屬性
      if(collection[i][arrSource[j]]&&source[arrSource[j]]==collection[i][arrSource[j]]){
        count++;
      } 
    }
    //判斷:如果完全包含艾栋,這個(gè)collection的元素就被允許添加到里邊爆存。
    if(count==arrSource.length){
       arr.push(collection[i]);
    }
  }
  return arr;
}
where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
5、查詢替換算法(Search and Replace)

使用給定的參數(shù)對(duì)句子執(zhí)行一次查找和替換蝗砾,然后返回新句子先较。
第一個(gè)參數(shù)是將要對(duì)其執(zhí)行查找和替換的句子。
第二個(gè)參數(shù)是將被替換掉的單詞(替換前的單詞)悼粮。
第三個(gè)參數(shù)用于替換第二個(gè)參數(shù)(替換后的單詞)闲勺。
注意:替換時(shí)保持原單詞的大小寫。例如扣猫,如果你想用單詞 "dog" 替換單詞 "Book" 菜循,你應(yīng)該替換成 "Dog"。

//思路:確定好了要替換的單詞和原來的單詞之后用replace方法直接替換
function myReplace(str, before, after) {
 if(before[0] === before[0].toUpperCase()){  //如果原單詞大寫申尤,替換的單詞也要大寫
    after = after[0].toUpperCase() + after.slice(1);
  }
  str = str.replace(before,after);  
  return str;
}
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
6癌幕、字符串移動(dòng)插入算法(Pig Latin)

把指定的字符串翻譯成 pig latin衙耕。
Pig Latin 把一個(gè)英文單詞的第一個(gè)輔音或輔音叢(consonant cluster)移到詞尾,然后加上后綴 "ay"勺远。
如果單詞以元音開始橙喘,你只需要在詞尾添加 "way" 就可以了。
對(duì)你有幫助的資源:
String.substr() 方法返回一個(gè)字符串中從指定位置開始到指定字符數(shù)的字符胶逢。

//思路:用indexOf方法判斷元素的第一個(gè)字母是不是元音厅瞎,如果是就直接加way,如果不是就用substr方法截取將第一個(gè)字母移到最后再加ay
function translate(str) {
var vowel = ["a", "e", "i", "o", "u"];
if (vowel.indexOf(str[0]) != -1) {
return str + "way";
}
while (vowel.indexOf(str[0]) == -1) {
str = str.substr(1) + str.substr(0, 1);
}
return str + "ay";
}
translate("consonant");
7初坠、字符配對(duì)算法(DNA Pairing)

DNA 鏈缺少配對(duì)的堿基和簸。依據(jù)每一個(gè)堿基,為其找到配對(duì)的堿基碟刺,然后將結(jié)果作為第二個(gè)數(shù)組返回锁保。
Base pairs(堿基對(duì)) 是一對(duì) AT 和 CG,為給定的字母匹配缺失的堿基南誊。
在每一個(gè)數(shù)組中將給定的字母作為第一個(gè)堿基返回。
例如蜜托,對(duì)于輸入的 GCG抄囚,相應(yīng)地返回 [["G", "C"], ["C","G"],["G", "C"]]
字母和與之配對(duì)的字母在一個(gè)數(shù)組內(nèi),然后所有數(shù)組再被組織起來封裝進(jìn)一個(gè)數(shù)組橄务。
對(duì)你有幫助的資源:
Array.prototype.map() 方法創(chuàng)建一個(gè)新數(shù)組幔托,其結(jié)果是該數(shù)組中的每個(gè)元素都調(diào)用一個(gè)提供的函數(shù)后返回的結(jié)果。

//思路:將字符串分割成數(shù)組蜂挪,然后將每一個(gè)元素進(jìn)行配對(duì)
function pair(str) {
  var arr = str.split("");
    var pair = '';
    var result = arr.map(function(item,index,array){
        switch(item){
            case 'A':
                pair = 'T';
                break;
            case 'T':
                pair = 'A';
                break;
            case 'C': 
                pair = 'G';
                break;
            case 'G':
                pair = 'C';
                break;
        }
        return [item,pair];
    });
    return result;
}
pair("GCG");
8重挑、字符串查詢補(bǔ)充算法()

從傳遞進(jìn)來的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中棠涮,返回 undefined谬哀。

/*思路:
(1)如果傳進(jìn)來的不是一個(gè)按順序來的字母隊(duì)列,需要給他轉(zhuǎn)成鍵碼严肪,排序史煎,再轉(zhuǎn)化為字符串。這段是題目之外的要求驳糯。
(2)接下來查找字符串排序后在a-z中的索引篇梭,然后根據(jù)索引用substring切割出來,用以比較(strCompare)
(3)遍歷這個(gè)數(shù)組酝枢,找到?jīng)]有的恬偷,*/
function fearNotLetter(str) {
var arrCover=[];
  for(var i=0;i<str.length;i++){
    arrCover.push(str[i].charCodeAt());
  }//轉(zhuǎn)化為鍵碼
  arrCover.sort(function(a,b){
    return a-b;
  });//重新排序
  str='';//清空
  for(i=0;i<arrCover.length;i++){
    str+=(String.fromCharCode(arrCover[i]));
  }//把轉(zhuǎn)化出來的數(shù)組重新給字符串
  //獲取索引
  var strAll='abcdefghijklmnopqrstuvwxyz';
  var indexOver=strAll.indexOf(str.charAt(str.length-1));
  var indexStart=strAll.indexOf(str.charAt(0));
  //切割出用以比較的字符串
  var strCompare=strAll.substring(indexStart,indexOver+1);
  var newStr='';
  if(strCompare==str){
    return undefined;
  }
  for(i=0;i<strCompare.length;i++){
    if(str.indexOf(strCompare[i])==-1){
      newStr+=strAll[i];
    }
  }
  console.log(newStr);
  return newStr;
}
fearNotLetter("abce");
9、輸入檢查算法(Boo who)

檢查一個(gè)值是否是基本布爾類型帘睦,并返回 true 或 false袍患。

function boo(bool){
    return (typeof bool == 'boolean');
}
boo(null);
10坦康、數(shù)組去重算法(Sorted Union)

寫一個(gè) function,傳入兩個(gè)或兩個(gè)以上的數(shù)組协怒,返回一個(gè)以給定的原始數(shù)組排序的不包含重復(fù)值的新數(shù)組涝焙。
換句話說,所有數(shù)組中的所有值都應(yīng)該以原始順序被包含在內(nèi)孕暇,但是在最終的數(shù)組中不包含重復(fù)值仑撞。
非重復(fù)的數(shù)字應(yīng)該以它們?cè)嫉捻樞蚺判颍罱K的數(shù)組不應(yīng)該以數(shù)字順序排序妖滔。
這是一些對(duì)你有幫助的資源:
Arguments object

//思路:循環(huán)逐個(gè)進(jìn)行對(duì)比隧哮,符合條件的放入數(shù)組中
function unite(arr1, arr2, arr3) {
var newArr=[];
  for(var i=1;i<arguments.length;i++){
    for(var j=0;j<arguments[i].length;j++){
      if(arguments[0].indexOf(arguments[i][j])==-1){
        newArr.push(arguments[i][j]);
      }
    }
  }
  newArr=arguments[0].concat(newArr);
  console.log(newArr);
  return newArr;
}
unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);
11、html符號(hào)轉(zhuǎn)實(shí)體算法(Convert HTML Entities)

將字符串中的字符&座舍、<沮翔、>、"(雙引號(hào)), 以及'(單引號(hào))轉(zhuǎn)換為它們對(duì)應(yīng)的 HTML 實(shí)體曲秉。
對(duì)你有幫助的資源:
HTML Entities

//思路:將數(shù)組分割成數(shù)組時(shí)候采蚀,每個(gè)元素進(jìn)行檢查,如果是符號(hào)就轉(zhuǎn)化成相應(yīng)的實(shí)體
function convert(str) {
  var i=0;
  var arr=str.split("");
  for(i=0;i<arr.length;i++){
    switch(arr[i]){
      case '&':
        arr.splice(i,1,'&amp;');
        break;
      case '>':
        arr.splice(i,1,'&gt;');
        break;
      case '<':
        arr.splice(i,1,'&lt;');
        break;
      case "'":
        arr.splice(i,1,'&apos;');
        break;
      case '"':
        arr.splice(i,1,'&quot;');
        break;
    }
  }
  str=arr.join('');
  return str;
}
convert("Dolce & Gabbana");
12承二、字符串連接算法(Spinal Tap Case)

將字符串轉(zhuǎn)換為 spinal case榆鼠。Spinal case 是 all-lowercase-words-joined-by-dashes 這種形式的,也就是以連字符連接所有小寫單詞亥鸠。

function spinalCase(str) {
str=str.replace(/([A-Z]+)/g,' $1');//在大寫字母前面加個(gè)空格妆够。用$來選擇小括號(hào)  
  str=str.replace(/\s+|_+/g,'-');//空格全部替換為- 
  if(str[0]=='-'){
    str=str.substring(1);
  }//去掉可能大寫開頭前面的-
  str=str.replace(/--/g,'-');//把中段的--(兩個(gè))替換為一個(gè)-。(因?yàn)橄聞澗€+大寫導(dǎo)致生成了兩個(gè)-)
  str=str.toLowerCase();//轉(zhuǎn)換小寫
rn str;
}
spinalCase('This Is Spinal Tap')
spinalCase("This Is Spinal Tap") 應(yīng)該返回 "this-is-spinal-tap"负蚊。
spinalCase("thisIsSpinalTap") 應(yīng)該返回 "this-is-spinal-tap"神妹。
spinalCase("The_Andy_Griffith_Show") 應(yīng)該返回 "the-andy-griffith-show"。
spinalCase("Teletubbies say Eh-oh") 應(yīng)該返回 "teletubbies-say-eh-oh"家妆。
13鸵荠、斐波納契奇數(shù)求和算法(Sum All Odd Fibonacci Numbers)

給一個(gè)正整數(shù)num,返回小于或等于num的斐波納契奇數(shù)之和伤极。
斐波納契數(shù)列中的前幾個(gè)數(shù)字是 1腰鬼、1、2塑荒、3熄赡、5 和 8,隨后的每一個(gè)數(shù)字都是前兩個(gè)數(shù)字之和齿税。
例如彼硫,sumFibs(4)應(yīng)該返回 5,因?yàn)殪巢{契數(shù)列中所有小于4的奇數(shù)是 1、1拧篮、3词渤。
提示:此題不能用遞歸來實(shí)現(xiàn)斐波納契數(shù)列。因?yàn)楫?dāng)num
較大時(shí)串绩,內(nèi)存會(huì)溢出缺虐,推薦用數(shù)組來實(shí)現(xiàn)。
參考文檔:博客園礁凡,Issue

function sumFibs(num) {
var fibo = [1, 1];  //定義數(shù)組高氮,存放奇數(shù)1
  var oddSum = 2;  //定義固定和為2
  while(true){
    var item = fibo[0] + fibo[1];   //
    if(num < item){  //當(dāng)數(shù)字小于2的時(shí)候,直接返回2
      return oddSum;
    }
    if(item % 2){   //算奇數(shù)顷牌,算和
      oddSum += item;    
    }
    fibo[0] = fibo[1];
    fibo[1] = item;
  }
}
sumFibs(4);
15剪芍、質(zhì)素求和算法(Sum All Primes)

求小于等于給定數(shù)值的質(zhì)數(shù)之和。
只有 1 和它本身兩個(gè)約數(shù)的數(shù)叫質(zhì)數(shù)窟蓝。例如罪裹,2 是質(zhì)數(shù),因?yàn)樗荒鼙?1 和 2 整除运挫。1 不是質(zhì)數(shù)状共,因?yàn)樗荒鼙蛔陨碚?br> 給定的數(shù)不一定是質(zhì)數(shù)。

function sumPrimes(num) {
var arr=[2];
  var sum=0;
  for(var i=2;i<=num;i++){
    var bCheck=true;//假定為真
    for(var j=0;j<arr.length;j++){//循環(huán)數(shù)組
      if(i%arr[j]==0){//如果可以被質(zhì)數(shù)整除
        bCheck=false;//判定為false
        break;//退出循環(huán)谁帕,用不著繼續(xù)判斷了峡继。
      }
    }
    if(bCheck){
      arr.push(i);
    }
  }
  console.log(arr);
  for(var k=0;k<arr.length;k++){
    sum+=arr[k];
  }//求和
  return sum;
}
sumPrimes(10);
16、最小公倍數(shù)算法(Smallest Common Multiple)

找出能被兩個(gè)給定參數(shù)和它們之間的連續(xù)數(shù)字整除的最小公倍數(shù)雇卷。
范圍是兩個(gè)數(shù)字構(gòu)成的數(shù)組鬓椭,兩個(gè)數(shù)字不一定按數(shù)字順序排序颠猴。
例如對(duì) 1 和 3 —— 找出能被 1 和 3 和它們之間所有數(shù)字整除的最小公倍數(shù)关划。
如果你被卡住了,記得開大招 Read-Search-Ask 翘瓮。嘗試與他人結(jié)伴編程贮折、編寫你自己的代碼。
對(duì)你有幫助的資源:
Smallest Common Multiple

/*思路:
(1)在此之前要了解歐拉算法求最大公約數(shù)资盅。
簡單的說调榄,求兩個(gè)數(shù)的最大公約數(shù),用大數(shù)對(duì)小數(shù)求模呵扛,如果能被整除每庆,則小數(shù)是這兩個(gè)數(shù)的最大公約數(shù)。
如果不能整除今穿,就用小數(shù)對(duì)余數(shù)再次求模缤灵,循環(huán)此過程直到返回能除盡的那個(gè)除數(shù)。就是最大公約數(shù)。
比如20和15腮出,用20除以15余數(shù)為5帖鸦,然后用15除以余數(shù)5,能夠整除胚嘲,所以返回出來的除數(shù)5為這兩個(gè)數(shù)的最大公約數(shù)作儿。
(2)有了最大公約數(shù),就可以求最小公倍數(shù)馋劈。
最小公倍數(shù)的求法是:彼此之間的乘積除以最大公約數(shù)攻锰。
因?yàn)槭乔髱讉€(gè)連續(xù)自然數(shù)之間的公倍數(shù),所以侣滩,求出前兩個(gè)最小公倍數(shù)之后口注,用這個(gè)最小公倍數(shù)和下一個(gè)值比較。
然后就得出了新的最小公倍數(shù)君珠。主要用的是遞歸的思想寝志。*/
function smallestCommons(arr) {
  arr=arr.sort(function(a,b){
    return a-b;
  });
  function fun(m,n){
    if(m%n===0) return n;
    return fun(n,m%n);
  }
  var num=arr[0];
  for(var i=arr[0]+1;i<=arr[1];i++){
    num*=i/fun(num,i);
  }
  return num;
}
smallestCommons([1,5]);
17、數(shù)組驗(yàn)證算法(Finders Keepers)

寫一個(gè) function策添,它遍歷數(shù)組 arr材部,并返回?cái)?shù)組中第一個(gè)滿足 func 返回值的元素。
舉個(gè)例子唯竹,如果 arr 為 [1, 2, 3]乐导,func 為 function(num) {return num === 2; },那么 find 的返回值應(yīng)為 2浸颓。
find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }) 應(yīng)該返回 8物臂。
find([1, 3, 5, 9], function(num) { return num % 2 === 0; }) 應(yīng)該返回 undefined。

//思路:這題相比前面的簡單很多了产上。注意:用break強(qiáng)制跳出循環(huán)棵磷。
function find(arr, func) {
  var num = 0;
  for(var i=0;i<arr.length;i++){
    if(func(arr[i])===true){
      num=arr[i];
      break;
    }
  }
  if(num===0){
    return undefined;  
  }
  return num;
}
find([1, 2, 3, 4], function(num){ return num % 2 === 0; });
18、數(shù)組取值算法(Drop it)

隊(duì)友該賣就賣晋涣,千萬別舍不得仪媒。
當(dāng)你的隊(duì)伍被敵人包圍時(shí),你選擇拯救誰谢鹊、拋棄誰非常重要算吩,如果選擇錯(cuò)誤就會(huì)造成團(tuán)滅。
如果是AD或AP佃扼,優(yōu)先拯救偎巢。
因?yàn)锳D和AP是隊(duì)伍輸出的核心。
其次應(yīng)該拯救打野兼耀。
因?yàn)榇蛞八懒藢?duì)面就可以無所顧慮地打龍压昼。
最后才是輔助或上單挎扰。
因?yàn)檩o助和上單都是肉,死了也不會(huì)對(duì)團(tuán)隊(duì)造成毀滅性影響巢音,該賣就賣遵倦。
但真實(shí)中的團(tuán)戰(zhàn)遠(yuǎn)比這要復(fù)雜,你的隊(duì)伍很可能會(huì)被敵人分割成2個(gè)或3個(gè)部分官撼。
當(dāng)你救了一個(gè)重要的人時(shí)梧躺,很可能其他隊(duì)友也會(huì)因此獲救。
舉個(gè)例子:
輔助和AD經(jīng)常是在一起的傲绣,打野和中單在一起掠哥,上單經(jīng)常一個(gè)人。
你救了AD秃诵,輔助也經(jīng)常因此獲救续搀。
讓我們來丟棄數(shù)組(arr)的元素,從左邊開始菠净,直到回調(diào)函數(shù)return true就停止禁舷。
第二個(gè)參數(shù),func毅往,是一個(gè)函數(shù)牵咙。用來測(cè)試數(shù)組的第一個(gè)元素,如果返回fasle攀唯,就從數(shù)組中拋出該元素(注意:此時(shí)數(shù)組已被改變)洁桌,繼續(xù)測(cè)試數(shù)組的第一個(gè)元素,如果返回fasle侯嘀,繼續(xù)拋出另凌,直到返回true。
最后返回?cái)?shù)組的剩余部分戒幔,如果沒有剩余吠谢,就返回一個(gè)空數(shù)組。

//思路:遍歷這個(gè)數(shù)組溪食,然后用func判斷返回的是布爾值囊卜,根據(jù)布爾值插入一個(gè)占位的字符串‘false’娜扇。待循環(huán)結(jié)束之后用filter過濾掉就行了错沃。
function drop(arr, func) {
  // Drop them elements.
  for(var i=0;i<arr.length;i++){
    if(func(arr[i])===false){
      arr.splice(i,1,'false');
    }else{
      break;
    }
  }
  arr=arr.filter(function(a){
    return a!='false';
  });
  console.log(arr);
  return arr;
}
drop([1, 2, 3], function(n) {return n < 3; });
19、數(shù)組簡化算法(Steamroller)

對(duì)嵌套的數(shù)組進(jìn)行扁平化處理雀瓢。你必須考慮到不同層級(jí)的嵌套枢析。
steamroller([[["a"]], [["b"]]]) 應(yīng)該返回 ["a", "b"]。
steamroller([1, [2], [3, [[4]]]]) 應(yīng)該返回 [1, 2, 3, 4]刃麸。
steamroller([1, [], [3, [[4]]]]) 應(yīng)該返回 [1, 3, 4]醒叁。
steamroller([1, {}, [3, [[4]]]]) 應(yīng)該返回 [1, {}, 3, 4]。

//思路:還是用遞歸的辦法。判斷數(shù)組用isArray把沼。算是遞歸方法的簡單實(shí)例啊易。
function steamroller(arr) {
  // I'm a steamroller, baby
  var newArr=[];
  function fun(a){
    for(var j=0;j<a.length;j++){
      if(Array.isArray(a[j])===true){
        fun(a[j]);    
      }else{
        newArr.push(a[j]);      
      }
    }
    return newArr;
  }
  fun(arr); 
  console.log(newArr);
  return newArr;
}
steamroller([1, [2], [3, [[4]]]]);
20、二進(jìn)制轉(zhuǎn)字符算法(Binary Agents)

傳入二進(jìn)制字符串饮睬,翻譯成英語句子并返回租谈。
二進(jìn)制字符串是以空格分隔的。

function binaryAgent(str) {
 var arr=str.split(' ');
  var arr10=[];
  var newStr='';
  for(var i=0;i<arr.length;i++){
    arr10.push(parseInt(arr[i],2));
  }
  for(var j=0;j<arr10.length;j++){
    newStr+=String.fromCharCode(arr10[j]);
  }
  return newStr;
}
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
21捆愁、數(shù)組元素判斷算法(Everything Be True)

所有的東西都是真的割去!
完善編輯器中的every函數(shù),如果集合(collection)中的所有對(duì)象都存在對(duì)應(yīng)的屬性(pre)昼丑,并且屬性(pre)對(duì)應(yīng)的值為真呻逆。函數(shù)返回ture。反之菩帝,返回false咖城。
記住:你只能通過中括號(hào)來訪問對(duì)象的變量屬性(pre)呼奢。
提示:你可以有多種實(shí)現(xiàn)方式酒繁,最簡潔的方式莫過于Array.prototype.every()

//思路:這個(gè)看起來很復(fù)雜控妻,其實(shí)只要做個(gè)json的for-in循環(huán)州袒,就可以實(shí)現(xiàn)。
function every(collection, pre) {
  var i='';
  var bCheck=true;//假設(shè)為真
  for(i in collection){
    if(!collection[i][pre]){
      bCheck=false;
    }
  }
  return bCheck;
}
every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");

22弓候、函數(shù)迭代可選參數(shù)算法(Arguments Optional)

創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function郎哭。如果只有一個(gè)參數(shù),則返回一個(gè) function菇存,該 function 請(qǐng)求一個(gè)參數(shù)然后返回求和的結(jié)果夸研。
例如,add(2, 3) 應(yīng)該返回 5依鸥,而 add(2) 應(yīng)該返回一個(gè) function亥至。
調(diào)用這個(gè)有一個(gè)參數(shù)的返回的 function,返回求和的結(jié)果:
var sumTwoAnd = add(2);
sumTwoAnd(3) 返回 5贱迟。
如果兩個(gè)參數(shù)都不是有效的數(shù)字姐扮,則返回 undefined。
對(duì)你有幫助的資源:
Closures 閉包

/*思路:這個(gè)其實(shí)就是call()方法衣吠。jquery的鏈?zhǔn)讲僮骶褪沁@樣實(shí)現(xiàn)的茶敏。
函數(shù)鏈?zhǔn)讲僮髟恚悍祷睾瘮?shù)本身。當(dāng)然也可以返回一個(gè)別的函數(shù)缚俏。
function show(str){
    alert(str);
    return show;//關(guān)鍵
}
show('abc')('bcd')惊搏;
上述代碼將彈出兩個(gè)框贮乳,abc,和bcd恬惯。只要你想向拆,可以無限地寫下去。
你可以返回一個(gè)函數(shù)酪耳,那么下次操作時(shí)亲铡,得到的就是這個(gè)函數(shù)。*/
function add(x) {
 if (arguments.length === 1 && typeof x === "number") {
   return function (y) { 
     if (typeof y === "number"){
       return x + y;
     }  
   }; 
 }else {
    if (typeof x !== "number"|| typeof arguments[1] !== "number") {
      return undefined;
    }
    return arguments[0] + arguments[1];
  } 
} 
add(2,3);

寫在最后:有更好的方法歡迎交流(__)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葡兑,一起剝皮案震驚了整個(gè)濱河市奖蔓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讹堤,老刑警劉巖吆鹤,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洲守,居然都是意外死亡疑务,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門梗醇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來知允,“玉大人,你說我怎么就攤上這事叙谨∥赂耄” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵手负,是天一觀的道長涤垫。 經(jīng)常有香客問我,道長竟终,這世上最難降的妖魔是什么蝠猬? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮统捶,結(jié)果婚禮上榆芦,老公的妹妹穿的比我還像新娘。我一直安慰自己喘鸟,他們只是感情好匆绣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迷守,像睡著了一般犬绒。 火紅的嫁衣襯著肌膚如雪旺入。 梳的紋絲不亂的頭發(fā)上兑凿,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天凯力,我揣著相機(jī)與錄音,去河邊找鬼礼华。 笑死咐鹤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圣絮。 我是一名探鬼主播祈惶,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扮匠!你這毒婦竟也來了捧请?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤棒搜,失蹤者是張志新(化名)和其女友劉穎疹蛉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體力麸,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡可款,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克蚂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闺鲸。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埃叭,靈堂內(nèi)的尸體忽然破棺而出摸恍,到底是詐尸還是另有隱情,我是刑警寧澤赤屋,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布误墓,位于F島的核電站,受9級(jí)特大地震影響益缎,放射性物質(zhì)發(fā)生泄漏谜慌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一莺奔、第九天 我趴在偏房一處隱蔽的房頂上張望欣范。 院中可真熱鬧,春花似錦令哟、人聲如沸恼琼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晴竞。三九已至,卻和暖如春狠半,著一層夾襖步出監(jiān)牢的瞬間噩死,已是汗流浹背颤难。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留已维,地道東北人行嗤。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像垛耳,于是被迫代替她去往敵國和親栅屏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容