Freecodecamp 算法題

Freecodecamp 算法題

1. Reverse a String

翻轉字符串

先把字符串轉化成數(shù)組,再借助數(shù)組的reverse方法翻轉數(shù)組順序,最后把數(shù)組轉化成字符串。

你的結果必須得是一個字符串

當你完成不了挑戰(zhàn)的時候,記得開大招'Read-Search-Ask'。

這是一些有幫助的資源:

思路:先把字符串轉化成數(shù)組,再借助數(shù)組的reverse方法翻轉數(shù)組順序,最后把數(shù)組轉化成字符串。

function reverseString(str) {
  str = str.split('').reverse().join('');
  return str;
}
reverseString("hello");

2. Factorialize a Number

如果用字母n來代表一個整數(shù),階乘代表著所有小于或等于n的整數(shù)的乘積。

階乘通常簡寫成 n!

例如: 5! = 1 * 2 * 3 * 4 * 5 = 120

  • 方法一:
function factorialize(num) {
if (num <= 1) {
   return 1;
}else {
   return factorialize(num - 1) * num;
}
  return num;
}

factorialize(10);
  • 方法二
function factorialize(num) {
if(num<=1){return 1;}
  var number=1;
  let n;
  for(n =1; n<num;n++){
     number *= n+1
  }
  return number;
}
factorialize(5);

3. Check for Palindromes

檢查回文字符串

如果給定的字符串是回文,返回true,反之,返回false。

如果一個字符串忽略標點符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個字符串就是palindrome(回文)。

注意你需要去掉字符串多余的標點符號和空格,然后把字符串轉化成小寫來驗證此字符串是否為回文。

函數(shù)參數(shù)的值可以為"racecar","RaceCar"和"race CAR"。

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

4. Find the Longest Word in a String

找出最長單詞

在句子中找出最長的單詞,并返回它的長度。

函數(shù)的返回值應該是一個數(shù)字。
思路:: 利用數(shù)組sort()方法,sort()方法需要接受一個比較函數(shù),該函數(shù)要比較兩個值,然后返回一個用于說明這兩個值的相對順序的數(shù)字。比較函數(shù)應該具有兩個參數(shù) a 和 b,其返回值如下:

  1. 若 a 小于 b,在排序后的數(shù)組中 a 應該出現(xiàn)在 b 之前,則返回一個小于 0 的值。
  2. 若 a 等于 b,則返回 0。
  3. 若 a 大于 b,則返回一個大于 0 的值。
function findLongestWord(str) {
  var result = str.split(' ');
  result.sort(function(firstElement, secondElement){
    return secondElement.length-firstElement.length;
  });
  return result[0].length;
}

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

5. Title Case a Sentence

句中單詞首字母大寫

確保字符串的每個單詞首字母都大寫,其余部分小寫。

像'the'和'of'這樣的連接符同理。
思路:使用split分離str,使用slice()是首字母大寫

再就是toLowerCase()和toUpperCase()的用法,要搞清前兩者和toLocaleLowerCase()、toLocaleUpperCase()的區(qū)別

function titleCase(str) {
  var result = str.split(' ')
  var newArray = [];
  for(let i=0;i<result.length;i++){
    var newStr=result[i].slice(0,1).toUpperCase() + result[i].slice(1).toLowerCase();
    newArray.push(newStr);
  }
  
  
  return newArray.join(' ');
}
titleCase("I'm a little tea pot");

6. Return Largest Numbers in Arrays

找出多個數(shù)組中的最大數(shù)

右邊大數(shù)組中包含了4個小數(shù)組,分別找到每個小數(shù)組中的最大值,然后把它們串聯(lián)起來,形成一個新數(shù)組。
思路:用for循環(huán)來迭代數(shù)組,并通過arr[i]的方式來訪問數(shù)組的每個元素。

function largestOfFour(arr) {
  var newArr=[];
 
  for(var i=0;i<arr.length;i++){
    let max=0;
    for(var j=0;j<arr[i].length;j++){
      if(arr[i][j] > max)  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]])

7. Confirm the Ending

檢查字符串結尾

判斷一個字符串(str)是否以指定的字符串(target)結尾。

如果是,返回true;如果不是,返回false。

function confirmEnding(str, target) {
  var result;
  str.substr(str.length-target.length,str.length)===target ? result= true : result = false;
  return result;
}

confirmEnding("Bastian", "n");

8. Repeat a string repeat a string

重復輸出字符串

重復一個指定的字符串 num次,如果num是一個負數(shù)則返回一個空字符串。
思路:用concat在字符串后面重復字符串

function repeat(str, num) {
  var result="";
  if(num<=0) return "";
  else {
    for(let i=0;i<num;i++){
      result=result.concat(str);
    }
  }
  return result;
}

repeat("abc", 3);

9. Truncate a string

截斷字符串
如果字符串的長度比指定的參數(shù)num長,
則把多余的部分用...來表示。

切記,插入到字符串尾部的三個點號也會計入字符串的長度。

但是,如果指定的參數(shù)num小于或等于3,則添加的三個點號不會計入字符串的長度。

function truncate(str, num) {
  var string='';
  if(num<str.length){
    if(num<=3){
      string = str.slice(0,num)+'...';
      return string;
    }else{
      string = str.slice(0,num-3)+'...';
      return string;
    }
  }
  return str;
}

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

10. Chunky Monkey

猴子吃香蕉, 分割數(shù)組
把一個數(shù)組arr按照指定的數(shù)組大小size分割成若干個數(shù)組塊。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];

function chunk(arr, size) {
  var newArr=[];
  for(let i=0;i<arr.length;i+=size){
    newArr.push(arr.slice(i,i+size))
  }
  return newArr;
}

chunk(["a", "b", "c", "d"], 3);

11. Slasher Flick

截斷數(shù)組

返回一個數(shù)組被截斷n個元素后還剩余的元素,截斷從索引0開始。
方法一:(slice)

function slasher(arr, howMany) {
  return arr.slice(howMany,arr.length);
}

slasher([1, 2, 3], 2);

方法二:(splice)

function slasher(arr, howMany) {
  arr.splice(0,howMany);
  return arr;
}

slasher([1, 2, 3], 2);

12. Mutations

比較字符串

(蛤蟆可以吃隊友,也可以吃對手)

如果數(shù)組第一個字符串元素包含了第二個字符串元素的所有字符,函數(shù)返回true。

舉例,["hello", "Hello"]應該返回true,因為在忽略大小寫的情況下,第二個字符串的所有字符都可以在第一個字符串找到。

["hello", "hey"]應該返回false,因為字符串"hello"并不包含字符"y"。

["Alien", "line"]應該返回true,因為"line"中所有字符都可以在"Alien"找到。

function mutation(arr) {
  var FirstVal=arr[0].toLowerCase();
  var SecondVal = arr[1].toLowerCase();
  for(var i in SecondVal){
    if(FirstVal.indexOf(SecondVal[i])==-1){
      return false;
    }
  }
 return true;
}

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

13. Falsy Bouncer

過濾數(shù)組假值

(真假美猴王)

刪除數(shù)組中的所有假值。

在JavaScript中,假值有false、null、0、""、undefined 和 NaN。

function bouncer(arr) {
   var newArr = arr.filter(function(e){
     if(e){
       return e;
     }
    
   });
   return newArr;
}
bouncer([7, "ate", "", false, 9]);

14. Seek and Destroy

摧毀數(shù)組
實現(xiàn)一個摧毀(destroyer)函數(shù),第一個參數(shù)是待摧毀的數(shù)組,其余的參數(shù)是待摧毀的值。
思路:

摧毀函數(shù)destroyer(arr,argument1,argument2,argument3,...)
函數(shù)參數(shù)不確定,第一個參數(shù)為一個數(shù)組,其他參數(shù)為要摧毀的數(shù)。即目標輸出的數(shù)組應該是第一個參數(shù)數(shù)組刪除其他參數(shù)后的數(shù)組。

將從第二個參數(shù)開始的參數(shù)組成一個數(shù)組。然后用fitter()來將數(shù)組內的每個數(shù)和新的數(shù)組進行比對,返回不符合的。

function destroyer(arr) {
  
  var arr_arg = arguments;
  var newArr=[];
  
  for(var i=1;i<arr_arg.length;i++){
    newArr.push(arr_arg[i]);
  }
  arr = arr.filter(function(val){
   return newArr.indexOf(val) == -1;
  });
   return arr;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

15. Where do I belong

數(shù)組排序并找出元素索引

先給數(shù)組排序,然后找到指定的值在數(shù)組的位置,最后返回位置對應的索引。

舉例:where([1,2,3,4], 1.5) 應該返回 1。因為1.5插入到數(shù)組[1,2,3,4]后變成[1,1.5,2,3,4],而1.5對應的索引值就是1。

同理,where([20,3,5], 19) 應該返回 2。因為數(shù)組會先排序為 [3,5,20],19插入到數(shù)組[3,5,20]后變成[3,5,19,20],而19對應的索引值就是2。

function where(arr, num) {
   arr.push(num);
   arr.sort(function(a,b){
     return a-b;
   });
   var result = arr.indexOf(num);
   return result;
}

where([40, 60], 50);

16. Caesars Cipher

凱撒密碼

(讓上帝的歸上帝,凱撒的歸凱撒)

下面我們來介紹風靡全球的凱撒密碼Caesar cipher,又叫移位密碼。

移位密碼也就是密碼中的字母會按照指定的數(shù)量來做移位。

一個常見的案例就是ROT13密碼,字母會移位13個位置。由'A' ? 'N', 'B' ? 'O',以此類推。

寫一個ROT13函數(shù),實現(xiàn)輸入加密字符串,輸出解密字符串。

所有的字母都是大寫,不要轉化任何非字母形式的字符(例如:空格,標點符號),遇到這些特殊字符,跳過它們。

ASCII字符

在JavaScript中可以通過String.prototype.charCodeAt()方法返回0至65535這間的整數(shù),代表索引處理字符的UTF-16編碼單元??梢酝ㄟ^這個方法查出每個字符對應的ASCII編碼:

'a'.charCodeAt();    //97
'A'.charCodeAt();    //65
'abc'.charCodeAt(0); //97
'ABC'.charCodeAt(0); //65

如此一來,A-Z對應的就是65-90。而ROT13是將大寫字符串將向后移13位,然后轉換成對應的字符。那么:

  • 小于65和大于90對應的就是小寫字符a-z
  • 大于等于65和小于等于77對應的就是大寫字符A-M
  • 大于等于78和小于等于90對應的就是大寫字符N-Z
function rot13(str) { 
  var newStr='';
  for(var i in str){
    var temp= str.charCodeAt(i);
    if(temp<65 || temp>91){
      newStr+=str[i];
      continue;
    }
    
    if(temp>77){
      newStr+=String.fromCharCode(temp-13);
    }else{
       newStr+=String.fromCharCode(temp+13);
    }
  }
  
  return newStr;
}

rot13("SERR CVMMN!")
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容