freeCodeCamp 初級javascript算法體驗

1、翻轉字符串(Reverse a String)

翻轉字符串
先把字符串轉化成數組,再借助數組的reverse方法翻轉數組順序,最后把數組轉化成字符串。
你的結果必須得是一個字符串
對你有幫助的資源:
Global String Object String對象的了解
String.split() 將一個String對象分割成字符串數組
Array.reverse() 將數組中元素的位置顛倒。第一個數組元素成為最后一個數組元素,最后一個數組元素成為第一個。
Array.join() 將數組(或一個類數組對象的所有元素連接到一個字符串中。

//思路:注意有的方法是針對字符串有的是針對數組,所以字符串和數組之間的轉換很重要!   
//hello--split-->["h", "e", "l", "l", "o"]--reverse-->["o", "l", "l", "e", "h"]--join-->olleh
function reverseString(str) {
  str = str.split("").reverse().join("");
  return str;
}
reverseString("hello");
2、計算一個整數的階乘(Factorialize a Number)

計算一個整數的階乘
如果用字母n來代表一個整數,階乘代表著所有小于或等于n的整數的乘積。
階乘通常簡寫成n!
例如:5! = 1 * 2 * 3 * 4 * 5 = 120
對你有幫助的資源:
Arithmetic Operators 算術運算符以數值(字面量或變量)作為其操作數,并返回一個單個數值。標準算術運算符是加法(+),減法( - ),乘法(*)和除法(/)。

//思路1:將要計算的數值從1開始遞加,是有數值相乘即可
function factorialize(num) {
  var result = 1;
  for(var i = 1;i<=num;i++){
    result = result * i;
  }
  return result;
}
factorialize(5);
//思路2:也可以用遞歸的思想,每次乘以比自己小1的數字
function factorialize(num) {
  // 請把你的代碼寫在這里
  if(num>0){
    return (num * factorialize(num-1));
  }else
    return 1;
}
factorialize(5);
3、檢查回文字符串(Check for Palindromes)

檢查回文字符串
如果給定的字符串是回文,返回true,反之,返回false。
如果一個字符串忽略標點符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個字符串就是palindrome(回文)。
注意你需要去掉字符串多余的標點符號和空格,然后把字符串轉化成小寫來驗證此字符串是否為回文。
函數參數的值可以為"racecar","RaceCar"和"race CAR"。
對你有幫助的資源:
String.replace() 方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。模式可以是一個字符串或者一個正則表達式, 替換值可以是一個字符串或者一個每次匹配都要調用的函數。
String.toLowerCase() 會將調用該方法的字符串值轉為小寫形式,并返回。

//思路:先去掉字符串多余的標點符號和空格,然后把字符串轉化成小寫,如果字符串和翻轉之后的字符串相等,則是回文
function palindrome(str) {
   str = str.toLowerCase().replace(/[\W\s_]/g, '');  //正則表達式:\w查找單詞字符,\W查找非單詞字符,\s查找空白字符,\S查找非空白字符
  return str === str.split("").reverse().join("");
}
palindrome("eye");
4、找出最長單詞(Find the Longest Word in a String)

找出最長單詞
在句子中找出最長的單詞,并返回它的長度。
函數的返回值應該是一個數字。
對你有幫助的資源:
String.length 獲取一個字符串的長度

//思路:先將句子分割成一個一個的字符串存在數組里,循環比較每個字符串的大小,將最大值賦值gwinnett臨時變量length
function findLongestWord(str) {
  var result = str.split(" ");
  var length = result[0].length;  //臨時變量,存放其中一個字符串的長度
  for(var i = 0 ;i<result.length;i++){
    if(result[i].length>length){
      length = result[i].length;
    }
  }
  return length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
5、句中單詞首字母大寫(Title Case a Sentence)

句中單詞首字母大寫
確保字符串的每個單詞首字母都大寫,其余部分小寫。
對你有幫助的資源:
String.slice() 提取一個字符串的一部分并返回一個新字符串

//思路:將所有的字符串小寫之后分割成單獨的字符串存放在數組里,循環數組將每一個字符串的首字母分割出來并大寫和其余的字符串合并起來形成新的字符串,最后將數組中的所有字符串連接成一個新的字符串
function titleCase(str) {
  var result = str.toLowerCase().split(" ");
  for(var i =0;i<result.length;i++){
    result[i] = result[i].slice(0,1).toUpperCase()+result[i].slice(1);
  }
  return result.join(' ');
}
titleCase("I'm a little tea pot");
6、找出多個數組中的最大數(Return Largest Numbers in Arrays)

找出多個數組中的最大數
右邊大數組中包含了4個小數組,分別找到每個小數組中的最大值,然后把它們串聯起來,形成一個新數組。
提示:你可以用for循環來迭代數組,并通過arr[i]的方式來訪問數組的每個元素。

//思路:通過二次循環,比較出每一組數組的最大值,存放到新的數組中
function largestOfFour(arr) {
  var newArr= [];  //存放新數組
  var temp;  //存放臨時最大值
  for(var i = 0;i<arr.length;i++){
    temp=arr[i][0];
    for(var j = 0;j<arr[i].length;j++){
      if(arr[i][j]>temp){
        temp = arr[i][j];
      }
      newArr[i]=temp;
    }
  }
  return newArr;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
7、檢查字符串結尾(Confirm the Ending)

檢查字符串結尾
判斷一個字符串(str)是否以指定的字符串(target)結尾。
如果是,返回true;如果不是,返回false。
對你有幫助的資源:
String.substr() 方法返回一個字符串中從指定位置開始到指定字符數的字符。

//思路:從target前面的字符位置(字符長度-target長度)開始截取,看截取出來的字符跟target一不一樣
function confirmEnding(str, target) {
  return str.substr(str.length-target.length) == target;
}
confirmEnding("Bastian", "n");
8、重復輸出字符串(Repeat a string repeat a string)

重復輸出字符串
重復一個指定的字符串 num次,如果num是一個負數則返回一個空字符串。

//思路:循環要輸出的次數,將字符串連接起來即可
function repeat(str, num) {
  var temp = "";
  for(var i = 0 ; i < num ; i ++){
    temp+=str;
  }
  return temp;
}
repeat("abc", 3);
9、截斷字符串(Truncate a string)

截斷字符
如果字符串的長度比指定的參數num長,則把多余的部分用...來表示。
切記,插入到字符串尾部的三個點號也會計入字符串的長度。
但是,如果指定的參數num小于或等于3,則添加的三個點號不會計入字符串的長度。

//思路:分成小于等于3和大于3的兩種情況,然后用slice切斷字符最后加上‘...’
function truncate(str, num) {
  if(num <= 3){
    str = str.slice(0,num)+'...';
  }else if(str.length > num){
    str = str.slice(0,num-3)+'...';
  }
  return str;
}
truncate("A-tisket a-tasket A green and yellow basket", 11);
10、猴子吃香蕉, 分割數組(Chunky Monkey)

猴子吃香蕉, 分割數組
(猴子吃香蕉可是掰成好幾段來吃哦)
把一個數組arr按照指定的數組大小size分割成若干個數組塊。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
對你有幫助的資源:
Array.push() 方法將一個或多個元素添加到數組的末尾,并返回數組的新長度。

//思路:先按照size確定分成幾組,如果有多余的組數+1,然后確定分割的開始和結束位置,將分割出來的數組存放到新的數組中
function chunk(arr, size) {
  var len = parseInt(arr.length/size);  //分組
  var remain = arr.length%size;   //取模,看是否有多余的數組
  var a = [];  //存放最后的數組
  var sot = remain > 0?len+1:len;
  for(var i = 1;i<=sot;i++){
    var start = size * (i - 1);    //確定開始和結束位置
    var end = (i>len)?(i-1)*size+remain:i*size;
    var mylocates = arr.slice(start,end);   // 分割數組
    a.push(mylocates);   //存放到新的數組中
  }
  return a;
}
chunk(["a", "b", "c", "d"], 2);
11、截斷數組(Slasher Flick)

截斷數組
返回一個數組被截斷n個元素后還剩余的元素,截斷從索引0開始。
對你有幫助的資源:
Array.splice() 方法通過刪除現有元素和/或添加新元素來更改一個數組的內容。

//思路:用splice函數,從0開始截斷howmany個長度,返回截斷之后的字符串
function slasher(arr, howMany) {
  arr.splice(0,howMany);
  return arr;
}
slasher([1, 2, 3], 2);
12、比較字符串(Mutations)

比較字符串
如果數組第一個字符串元素包含了第二個字符串元素的所有字符,函數返回true。
舉例,["hello", "Hello"]
應該返回true,因為在忽略大小寫的情況下,第二個字符串的所有字符都可以在第一個字符串找到。
["hello", "hey"]應該返回false,因為字符串"hello"并不包含字符"y"。
["Alien", "line"]應該返回true,因為"line"中所有字符都可以在"Alien"找到。
對你有幫助的資源:
String.indexOf() 方法返回調用String對象中第一次出現的指定值的索引,開始在 fromIndex進行搜索。如果未找到該值,則返回-1。
String.charAt() 方法從一個字符串中返回指定的字符。

//思路:在第一個字符串里面循環查找第二個字符串中的每一個字符,有一個就沒有false
function mutation(arr) {
  for(var i =0;i<arr[1].length;i++){
    if(arr[0].toUpperCase().indexOf(arr[1].charAt(i).toUpperCase())==-1)  return false;   
  }
  return true;
}
mutation(["hello", "hey"]);

13、過濾數組假值(Falsy Bouncer)

過濾數組假值
刪除數組中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined和NaN。
對你有幫助的資源:
Boolean Objects 對象是一個布爾值的對象包裝器。
Array.filter() 為數組中的每個元素調用一次 callback函數,并利用所有使得 callback返回 true 或等價于 true 的值的元素創建一個新數組。

//思路:新建一個callback函數,檢測元素是否是假元素,不是假元素則返回元素,用callback函數過濾需要檢查的數組,返回過濾剩下的元素
function bouncer(arr) {
  function isBigEnough(element){
    if(element!==false || element!==null || element!==0 || element!=="" || element!==undefined || element!==NaN){
      return element;
    }
  }
  var filtered = arr.filter(isBigEnough);    //過濾函數
  return filtered;
}
bouncer([7, "ate", "", false, 9]);
14、摧毀數組(Seek and Destroy)

摧毀數組
金克斯的迫擊炮!
實現一個摧毀(destroyer)函數,第一個參數是待摧毀的數組,其余的參數是待摧毀的值。
對你有幫助的資源:
Arguments object 是一個類似數組的對象, 對應于傳遞給函數的參數。是隱藏的參數。

//思路:將要刪除的元素存放到一個數組中,用filter函數過濾掉要刪除的元素(用indexOf方法)
function destroyer(arr) {
  var args = [];  //存放要刪除的元素
  for(var i =1;i<arguments.length;i++){
    args.push(arguments[i]);  //將隱藏的參數(待刪除的值)存放到一個數組中,除去第一個數組值,所以從1開始存放
  }
  var temp = arr.filter(function(item,index,array){
    return args.indexOf(item) < 0;
  });  //用filter函數,返回數組中未找到item的值,即不用刪除的值
  return temp;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
15、數組排序并找出元素索引(Where do I belong)

數組排序并找出元素索引
舉例:where([1,2,3,4], 1.5) 應該返回 1。因為1.5插入到數組[1,2,3,4]后變成[1,1.5,2,3,4],而1.5對應的索引值就是1。
同理,where([20,3,5], 19) 應該返回 2。因為數組會先排序為 [3,5,20],19插入到數組[3,5,20]后變成[3,5,19,20],而19對應的索引值就是2。

//思路:將num值跟數組中的值循環進行對比,r記錄num是第幾位排序
function where(arr, num) {
  var len = arr.length;
  var r = 0;
  for(var i =0;i<len;i++){
    if(num > arr[i]){
      r++;
    }
  }
  return r;
}
where([40, 60], 50);
16、凱撒密碼(Caesars Cipher)

凱撒密碼
下面我們來介紹風靡全球的凱撒密碼Caesar cipher,又叫移位密碼。
移位密碼也就是密碼中的字母會按照指定的數量來做移位。
一個常見的案例就是ROT13密碼,字母會移位13個位置。由'A' ? 'N', 'B' ? 'O',以此類推。
寫一個ROT13函數,實現輸入加密字符串,輸出解密字符串。
所有的字母都是大寫,不要轉化任何非字母形式的字符(例如:空格,標點符號),遇到這些特殊字符,跳過它們。
對你有幫助的資源:
String.charCodeAt() 方法返回0到65535之間的整數,表示給定索引處的UTF-16代碼單元 (在 Unicode 編碼單元表示一個單一的 UTF-16 編碼單元的情況下,UTF-16 編碼單元匹配 Unicode 編碼單元。但在——例如 Unicode 編碼單元 > 0x10000 的這種——不能被一個 UTF-16 編碼單元單獨表示的情況下,只能匹配 Unicode 代理對的第一個編碼單元) 。如果你想要整個代碼點的值,使用 codePointAt()。
String.fromCharCode() 方法返回使用指定的Unicode值序列創建的字符串。

//思路:unicode編碼范圍:大寫字母[65,90],小寫字母[97,122]
function rot13(str) { 
  var str1 = [];
  for(var i =0;i<str.length;i++){
    var num = str[i].charCodeAt();    //返回字母的編碼
    if(num>=65&&num<=77)  //前13個大寫字母
      num = num+13;
    else if(num>77&&num<91)  //后13個大寫字母
      num = num - 13;
    str1.push(String.fromCharCode(num));  //接收指定的unicode值,返回一個字符串
  }
  return str1.join("");
}
rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK."); 
寫在最后的注意點:
  • indexOf的‘o‘一定要大寫,我已經掉坑兩次,檢查了好久不知道錯在哪里
  • slice()方法 和splice 方法的區別。。。
  • 區別有些方式是string方法,有些是array方法,所以要會string和array之間的靈活轉換
  • 熟練運行各種截取string字符串的方法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,992評論 19 139
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 網友問: 老顯先生,您好,您可以告訴我在現在這個時代我們相親也好,朋友介紹也好,我們到底應該以什么為標準? 我也見...
    老顯閱讀 647評論 0 0
  • 為了讓孩子養成每天晚上9點鐘睡覺的習慣,我規定到了九點鐘,家里面所有的燈都關掉。 7點鐘我還沒有下班,打了孩子的電...
    牧田麻麻閱讀 250評論 0 0
  • 畢業將至,書本太多太重,沒辦法搬回家。有些書或許未來會有大用,雖然搬不走,但能記錄下來,以后在網上再買。 大學物理...
    Manegga閱讀 162評論 0 0