freeCodeCamp关于js字符串和数组的基本算法题

这是一些对你有帮助的资源:
String
Array
Arithmetic Operators
Comparison Operators
Boolean Objects
Arguments object

1.Reverse a String

翻转字符串
先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
你的结果必须得是一个字符串

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

function factorialize(num) {
  // 请把你的代码写在这里
  var number = 1;
  while( num > 0 ){
    number *= num;
    num --;
  }
  return number;
}

factorialize(5);

3.Check for Palindromes

如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
函数参数的值可以为"racecar","RaceCar"和"race CAR"。

function palindrome(str) {
 // Good luck!
 str=str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,""); //去除标点符号,这是我百度的,js的正则不是很熟悉
 str = str.replace(/\s+/g);
 str = str.toLowerCase();
 var arr = str.split('');
   arr = arr.reverse();
  var str1 = arr.join("");
 if(str === str1){
 return true;}
 return false;
}

palindrome("eye");
 
/*
palindrome("eye") 应该返回一个布尔值
palindrome("eye") 应该返回 true.
palindrome("race car") 应该返回 true.
palindrome("not a palindrome") 应该返回 false.
palindrome("A man, a plan, a canal. Panama") 应该返回 true.
palindrome("never odd or even") 应该返回 true.
palindrome("nope") 应该返回 false.
palindrome("almostomla") 应该返回 false.
palindrome("My age is 0, 0 si ega ym.") 应该返回 true.
palindrome("1 eye for of 1 eye.") 应该返回 false.
palindrome("0_0 (: /-\ :) 0-0") 应该返回 true.
*/

4.Find the Longest Word in a String

找出最长单词
在句子中找出最长的单词,并返回它的长度。
函数的返回值应该是一个数字。

function findLongestWord(str) {
  // 请把你的代码写在这里
  var splitArr = str.split(" ");
  var maxStr = "";
  for(var i = 0; i<splitArr.length-1; i++){
    if(i != splitArr.length-1){
        if(splitArr[i].length>splitArr[i+1].length){
            if(splitArr[i].length>maxStr.length){
               maxStr = splitArr[i];
            } 
        } else {
            if(splitArr[i+1].length>maxStr.length){
               maxStr = splitArr[i+1];
            } 
        }
    } 
  }
  return maxStr.length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

5.Title Case a Sentence

确保字符串的每个单词首字母都大写,其余部分小写。(eg:titleCase("I'm a little tea pot") 应该返回 "I'm A Little Tea Pot". titleCase("sHoRt AnD sToUt") 应该返回 "Short And Stout".)

/*这题很简单,主要是要明白 split() 是把字符串分割成数组 
join() 是把 数组变成字符串 
toLowerCase() toUpperCase() 大小写转换,注意,只对字母有效,其他字符(eg:/,!@)无效
*/
 
function titleCase(str) {
 str = str.split(" ");//按照空格把字符串分割成数组
  for (var i = 0; i < str.length; i++) {
    str[i] = str[i].toLowerCase();
    str[i] = str[i].substring(0, 1).toUpperCase() + str[i].substring(1);
  }
  return str.join(" ");//通过空格把数组连接成字符串
}
 
titleCase("I'm a little tea pot");

6.Return Largest Numbers in Arrays

找出多个数组中的最大数

右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。

提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。

function largestOfFour(arr) {
  // 请把你的代码写在这里
  var newArr = [];
  var i = 0;
  while(i < arr.length){
    var maxNum = 0;
    for(var j = 0; j<arr[i].length-1; j++){
       if(arr[i][j] > arr[i][j+1]){
         if(arr[i][j] > maxNum){
            maxNum = arr[i][j];
         }
       } else {
         if(arr[i][j+1] > maxNum){
            maxNum = arr[i][j+1];
         }
       }
    }
    
    i++;
    newArr.push(maxNum);
  }
  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。

例如:confirmEnding("Bastian", "n") 应该返回 true. confirmEnding("Connor", "n") 应该返回 false. confirmEnding("Walking on water and developing software from a specification are easy if both are frozen", "specification") 应该返回 false.

function confirmEnding(str, target) {
 // "Never give up and good luck will find you."
 // -- Falcor
  
 return str.substr(str.length-target.length) == target ? true:false;
}
 
confirmEnding("Bastian", "n");
confirmEnding("He has to give me a new name", "na");
/*
confirmEnding("Bastian", "n") 应该返回 true.
confirmEnding("Connor", "n") 应该返回 false.
confirmEnding("Walking on water and developing software from a specification are easy if both are frozen", "specification") 应该返回 false.
confirmEnding("He has to give me a new name", "name") 应该返回 true.
confirmEnding("He has to give me a new name", "me") 应该返回 true.
confirmEnding("He has to give me a new name", "na") 应该返回 false.
confirmEnding("If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing", "mountain") 应该返回 false.
*/

8.Repeat a string repeat a string

重要的事情说3遍!
重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。例如:
repeat("", 3) 应该返回"*".
repeat("abc", 3) 应该返回"abcabcabc".
repeat("abc", 4) 应该返回"abcabcabcabc".
repeat("abc", 1) 应该返回"abc".
repeat("
", 8) 应该返回"********".
repeat("abc", -2) 应该返回"".
当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。
这是一些对你有帮助的资源:
•Global String Object

function repeat(str, num) {
 // repeat after me
 var newstr = str;
 if(num >1){
  for(var i = 1; i< num ; i ++){
   str +=newstr;
  }
  return str;
 }else if(num == 1){
  return str;
 }else{
  return "";
 }
  
}
repeat("abc", 3);
repeat("*", 3);

9.Truncate a string

截断字符串(用瑞兹来截断对面的退路)

如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

function truncate(str, num) {
  // 请把你的代码写在这里
  if(str.length > num){
    if (str.length - num >= 30){
      return str.slice(0, num - str.length -3) + "...";
    }else {
      return str.slice(0, num - str.length) + "...";
    }
    
  } 
  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]];

function chunk(arr, size) {
 // Break it up.
var arr1 = [];
  for (var i = 0; i < arr.length; i = i + size) {
    var arr2 = arr;
    arr1.push(arr2.slice(i, i + size));
  }
  return arr1;
}
chunk(["a", "b", "c", "d"], 2);

11.Slasher Flick

截断数组
返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。

function slasher(arr, howMany) {
  // 请把你的代码写在这里
  var newArr = 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"找到。

function mutation(arr) {
  // 请把你的代码写在这里
  var str1 = arr[0].toLowerCase();
  var str2 = arr[1].toLowerCase();
  var strArr = str2.split("");

  for(var i = 0; i<strArr.length; i++){
     var pos = str1.indexOf(strArr[i]);
     if(pos === -1){
        return false;
     }
  }
  return true;
}
mutation(["hello", "hey"]);

13.Falsy Bouncer

真假美猴王!
删除数组中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined 和NaN。
当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。
这是一些对你有帮助的资源:
•Boolean Objects
•Array.filter()
例如:
bouncer([7, "ate", "", false, 9]) 应该返回 [7, "ate", 9].
bouncer(["a", "b", "c"])应该返回 ["a", "b", "c"].
bouncer([false, null, 0, NaN, undefined, ""]) 应该返回 [].
bouncer([1, null, NaN, 2, undefined]) 应该返回 [1, 2].

/* 
这题注意是对filter的理解,这是我最开始的代码,写的不是很好,没多大参考价值
还要注意 NaN 比较。 自己不等于自己(NaN != NaN )
*/
 
function bouncer(arr) {
 // Don't show a false ID to this bouncer.
 var arr1 =[];
  var j = 0;
  arr.filter(function(val, index) {
    if (val === false || val === null || val === 0 || val === "" || val === undefined || val !== val) {
      arr1.push(index);
    }
  });
  var len = arr1.length;
 
  for(var i = 0; i < len ; i++){
     arr.splice(arr1[i]-j,1);
     j++;
  }
 return arr;
}
bouncer([7, "ate", "", false, 9]);

14.Seek and Destroy

金克斯的迫击炮!
实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
例如:
destroyer([1, 2, 3, 1, 2, 3], 2, 3) 应该返回 [1, 1].
destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3) 应该返回 [1, 5, 1].
destroyer([3, 5, 1, 2, 2], 2, 3, 5) 应该返回 [1].
destroyer([2, 3, 2, 3], 2, 3) 应该返回 [].
destroyer(["tree", "hamburger", 53], "tree", 53) 应该返回["hamburger"].
这是一些对你有帮助的资源:
•Arguments object
•Array.filter()

function destroyer(arr) {
 // Remove all the values
 var tempArguments = arguments;
 return arr.filter(function(entry) {
  for(var i = 1; i< tempArguments.length; i++) {
   if (entry == tempArguments[i]) {
    return false;
   }
  }
  return true;
 });
}
 
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。
这是一些对你有帮助的资源:
•Array.sort()

function where(arr, num) {
 // Find my place in this sorted array.
 //注意sort() 排序规则
 arr.sort(function(a,b){
   return a- b;
 });
 
 for(var i =0;i<arr.length;i++){
  if(arr[i]>num | arr[i] == num){
   return i;
  }
 }
 return arr.length;
}

where([5, 3, 20, 3], 5);

16.Caesars Cipher

凯撒密码 (让上帝的归上帝,凯撒的归凯撒。)

下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。

移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。

写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。

例如:
rot13("SERR PBQR PNZC") 应该解码为 "FREE CODE CAMP"
rot13("SERR CVMMN!") 应该解码为 "FREE PIZZA!"
rot13("SERR YBIR?") 应该解码为 "FREE LOVE?"
rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.") 应该解码为 "THE QUICK BROWN DOG JUMPED OVER THE LAZY FOX."
这是一些对你有帮助的资源:
•String.charCodeAt()
•String.fromCharCode()

function rot13(str) { // LBH QVQ VG!
  // 请把你的代码写在这里
  var arr = str.toUpperCase().split(" ");
  var str1 = [];
  for (var i = 0; i < arr.length; i++) {
    var arr1 = arr[i].split("");
    for (var j = 0; j < arr1.length; j++) {
      var num = arr1[j].charCodeAt();
      if (num >= 65 && num <= 90) {
        arr1[j] = num + 13 > 90 ? String.fromCharCode(64 + (num + 13 - 90)):String.fromCharCode(num + 13); //64 + (num + 13 - 90) 要明白为什么是64 ,
      }
 
    }
    str1.push(arr1.join(""));
  }
  return str1.join(" ");
}

rot13("SERR PBQR PNZC");  // 你可以修改这一行来测试你的代码

我是楚简约,感谢您的阅读,

喜欢就点个赞呗,“❤喜欢”,

鼓励一下,你在看,我就继续写~

非简书用户,可以点右上角的三个“...”,然后"在Safari中打开”,就可以点赞咯~


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容