Freecodecamp 算法題

Freecodecamp 算法題

1. Reverse a String

翻轉(zhuǎn)字符串

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

你的結(jié)果必須得是一個字符串

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

這是一些有幫助的資源:

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

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(回文)蜗顽。

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

函數(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

檢查字符串結(jié)尾

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

如果是卦绣,返回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ù)組內(nèi)的每個數(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)輸入加密字符串判帮,輸出解密字符串渣触。

所有的字母都是大寫齿诉,不要轉(zhuǎ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位,然后轉(zhuǎn)換成對應的字符束莫。那么:

  • 小于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!")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懒棉,一起剝皮案震驚了整個濱河市草描,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌策严,老刑警劉巖穗慕,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妻导,居然都是意外死亡逛绵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門倔韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來术浪,“玉大人,你說我怎么就攤上這事狐肢√砺穑” “怎么了沥曹?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵份名,是天一觀的道長。 經(jīng)常有香客問我妓美,道長僵腺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任壶栋,我火速辦了婚禮辰如,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贵试。我一直安慰自己琉兜,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布毙玻。 她就那樣靜靜地躺著豌蟋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桑滩。 梳的紋絲不亂的頭發(fā)上梧疲,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音运准,去河邊找鬼幌氮。 笑死,一個胖子當著我的面吹牛胁澳,可吹牛的內(nèi)容都是我干的该互。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼韭畸,長吁一口氣:“原來是場噩夢啊……” “哼慢洋!你這毒婦竟也來了塘雳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤普筹,失蹤者是張志新(化名)和其女友劉穎败明,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體太防,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡妻顶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜒车。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讳嘱。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酿愧,靈堂內(nèi)的尸體忽然破棺而出沥潭,到底是詐尸還是另有隱情,我是刑警寧澤嬉挡,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布钝鸽,位于F島的核電站,受9級特大地震影響庞钢,放射性物質(zhì)發(fā)生泄漏拔恰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一基括、第九天 我趴在偏房一處隱蔽的房頂上張望颜懊。 院中可真熱鬧,春花似錦风皿、人聲如沸河爹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咸这。三九已至,卻和暖如春鲁僚,著一層夾襖步出監(jiān)牢的瞬間炊苫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工冰沙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侨艾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓拓挥,卻偏偏與公主長得像唠梨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侥啤,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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