freecodecamp 算法部分刷題筆記

字符串反轉

function reverseString(str) {
  str = str.split(' ').reverse();
  for(var i = 0;i < str.length;i ++){
    str[i] = str[i].split('').reverse().join('');
  }
  str = str.join(' ');
  return str;
}

reverseString("Greetings from Earth");

求階乘

function factorialize(num) {
  var total = 1;
  if(num === 0){
    num = 1;
  }else{
    for(var i = 1;i <= num;i ++){
      total *= i;
    }
    num = total;
  }
  return num;
}

factorialize(5);

簡化一下if-else

function factorialize(num) {
   return num > 1 ? num * factorialize(num - 1) : 1;
}

factorialize(5);

驗證迴文

String.replace()
String.toLowerCase()

\s替換空格,[^a-zA-Z0-9]/g爲全局替換非字母和數字

function palindrome(str) {
    var newStr = str.replace(/\s/g,"").replace(/[^a-zA-Z0-9]/g,"").toLowerCase();
    var reverStr = newStr.split("").reverse().join("");
   if(reverStr === newStr){
      return true;
   }
   else{
     return false;
  } 
}

palindrome("A man, a plan, a canal. Panama");

求最長單詞長度

function findLongestWord(str) {
  var arr = str.split(/\s/g);
  console.log(arr);
  var length = 0;
  for(var i = 0;i < arr.length;i ++){
    length = length > arr[i].length ? length : arr[i].length;
    console.log(length);
  }
  return length;
}

findLongestWord("The quick brown fox jumped over the lazy dog");

大寫所有單詞首字母

function titleCase(str) {
  var arr = str.toLowerCase().split(/\s/g);
  var newStr;
  for(var i = 0;i < arr.length;i ++){
    arr[i] = arr[i][0].toUpperCase() + arr[i].substring(1, arr[i].length);
  }
  newStr = arr.join(' ');
  return newStr;
}

titleCase("I'm a little tea pot");

在大寫首字母的時候,最開始想用arr[i][0].toUpperCase(),後來發現這樣並不行,研究了一下,這個和數據結構有關,具體也不是很懂,大概就是字符串是常量存在堆裏面不能修改,而數組是存儲在棧裏面的可以修改


尋找數組中數組中的最大值

function largestOfFour(arr) {
  var max = null;
  var newarr = [];
  for(var i = 0;i < arr.length;i ++){
    max = arr[i][0];
    for(var j = 1;j < arr[i].length;j ++){
      max = max >= arr[i][j] ? max : arr[i][j]; 
    }
    newarr.push(max);
  }
  return newarr;
}

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

檢查字符串是否以指定字符串結尾

String.substr

function confirmEnding(str, target) {
  var tarlen = target.length;
  var subStr = str.substr(-tarlen,tarlen);
  if(subStr == target){
      return true;
  }else{
      return false;
  }
}

confirmEnding("my city Bastian", "tian");

重複指定次數的字符串

function repeat(str, num) {
  var newstr = '';
  if(num <= 0){
    return newstr;
  }else{
    for(var i = 0;i < num; i ++){
      newstr += str;
    }
  }
  return newstr;
}

repeat("abc", 3);

截斷字符串

String.slice()

//...也要算3個字符長度
function truncate(str, num) {
  var strLen = str.length;
  if(num >= strLen){return str;}
  else if(num > 3){
    str = str.slice(0,num - 3) + '...';
  }else{
    str = str.slice(0,num) + "...";
  }
  return str;
}

truncate("A-tisket a-tasket A green and yellow basket", 11);

Array.push():push可以直接push一個數組,形成二維數組,也可以通過apply把一個數組push進另一個數組,達到合併的目的。MDN上有解釋
Array.slice():

方法一:通過push(),單獨取出每一個數push進新數組

function chunk(arr, size) {
  if(arr.length <= size){
    return arr;
  }else{
    //len存儲新的二維數組的一維長度
    var len = 0;
    //定義一維數組
    var newArr = new Array();
    //newSize作爲子數組的長度,原因是當arr.length % size > 0時,最後一個子數組的長度是不定的,此時需要更改size的長度,而在取arr中的元素push進新數組的時候需要用到原本的size,所以創建一個size的複製的值來避免衝突。
    var newSize = size;
    //根據arr.length % size是否有餘數來生成新數組的長度
    if(arr.length % size > 0){
      len = parseInt(arr.length / size) + 1;
    }else{
      len = parseInt(arr.length / size);
    }
    //三目運算符的簡化:len = (arr.length % size > 0) ? len + 1 : len; 
    for(var i = 0;i < len;i ++){
      //定義二維數組
        newArr[i] = new Array();
      //這裏就是當arr.length % size > 0,在生成最後一個子數組的時候,改變子數組的長度。
        if(i == parseInt(arr.length / size)){
            newSize = arr.length % size;
        }
      //給新的二維數組賦值
        for(var j = 0;j < newSize;j ++){
            newArr[i].push(arr[i * size + j]);
        }
    }
  }
  return newArr;
}  
chunk([0, 1, 2, 3, 4], 2);

方法二:通過slice()取出新的子數組,push()進新數組中

function chunk(arr, size) {
  if(arr.length <= size){
    return arr;
  }else{
    var len = parseInt(arr.length / size);
    var newArr = new Array();
    len =(arr.length % size > 0) ? len + 1 : len;   
    for(var i = 0;i < len;i ++){
        var start = i * size;
      //在生成最後一個子數組的時候,因爲只有當arr.length % size > 0時,纔會出現i == len的情況
        var end = (i == len) ? ((i + 1 )* size + (arr.length % size)) : (i+1) * size;
        newArr.push(arr.slice(start,end));
    }
  }
  return newArr;
}  
chunk(["a", "b", "c", "d","e"], 2);

返回數組被截斷n個元素後剩餘的元素

Array.slice()

function slasher(arr, howMany) {
  var newArr = [];
  if(arr.length <= howMany){
    return newArr;
  }else{
    //slice會截取從start-end的數返回新數組,但是不包括end,所以當end=arr.length時,截取到arr[7]但是不包括arr[7],並且arr[7]也不存在。或者可以省略end,就會直接截取到數組末尾了。
    newArr = arr.slice(howMany,arr.length);    
    //newArr = arr.slice(howMany);

  }
  // it doesn't always pay to be first
  return newArr;
}

slasher(["burgers", "fries", "shake"], 1);

判斷一個字符串是否包含了第二個字符串元素的所有字符(不區分大小寫)

String.indexOf()

function mutation(arr) {
  var target = arr[0].toLowerCase();  
  var test = arr[1].toLowerCase();
  for(var i = 0;i < test.length;i ++){
    if(target.indexOf(test[i]) ==-1){
      return false;
    }
  }
  return true;
}

mutation(["hello", "he"]);

去掉數組中的假值

Array.filter()
Boolean Objects

function bouncer(arr) {
//filter()會測試數組的每個元素,返回符合filter條件,也就是滿足isBool()的元素。
   var newArr =  arr.filter(isBool);
   return newArr;
}
function isBool(value){
  return Boolean(value) > 0;
}

bouncer([7, "ate", "", false, 9]);

從數組中刪除傳入的參數

Arguments object
Array.filter()

function destroyer(arr) {  
  //這裏需要保存傳入的參數,因爲在匿名函數中傳入的arguments發生了變化
  var tempArguments = arguments;  
  var newArr = arr.filter(function(value) {    
    for(var i = 1; i < tempArguments.length; i++) {      
      if (value == tempArguments[i]) {        
        return false;      
      }   
    }   
    return true;
  });
  return newArr; 
}

先排序,再找到元素在數組中的位置

Array.sort()

function where(arr, num) {
  arr.push(num);
  arr.sort(function(val1,val2){
    return val1 - val2;
  });

  return arr.indexOf(num);
}

where([40, 60], 50);

ROT13解碼

String.fromCharCode()
String.charCodeAt()
Function.prototype.apply()

function rot13(str) {
  //newStr用來轉化大小寫
  var newStr = str.toUpperCase();
  //由於需要把字符串中的字母轉換爲編碼值,但是不能直接更改字符串中的某個元素,所以需要一個數組來作爲中介
  var newArr = new Array();
  for(var i = 0;i < newStr.length;i ++){
    //如果是大寫字母則進行解碼,解碼規則是A-M和N-Z相互對應。如果是其他字符則只是轉換爲編碼值。
    if(newStr[i] >= 'A' && newStr[i] <= 'Z'){
        newArr[i] =  newStr.charCodeAt(i) <= 77 ? newStr.charCodeAt(i) + 13 :  newStr.charCodeAt(i) - 13;
    }else{
        newArr[i] = newStr.charCodeAt(i);
    }
  }
  // newStr = newArr.join(',');
  //formCharCode只能接受字符串參數,所以通過apply()完成傳參。
  return String.fromCharCode.apply(this,newArr);
}

rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.");

總結

  • split() → 數組 → join() → 字符串 → split() 以上方法不改變原始數組,返回原始數組被改變後的一個新數組
  • splice() 從原始數組中刪除/添加元素,返回被刪除的元素組成的數組,改變原始數組
  • slice() 從原始數組中選擇從開始到結束的數組,不包括結束,返回被選擇的元素組成的數組,不改變原始數組
  • substr(),substring():substring接收的是起始位置和結束位置(不包括結束位置),而substr接收的則是起始位置和所要返回的字符串長度,兩者都用於處理字符串,不能直接用於數組

終於結束了階段性的刷題,不管還記得多少,至少學會了認真閱讀文檔,當然還有很多比如apply()這種自己看了一百遍,但是也不知道什麼時候該用的問題繼續困擾着自己,比如閉包,也是模模糊糊,你說我知道,你讓我做,sorry我是豬。所以還要多看書,多實戰,fcc這樣的刷題練習真的很好呀。開心~~撒花

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章