首页 > 网站 > WEB开发 > 正文

FreeCodeCamp javascript 算法题review part1

2024-04-27 15:03:25
字体:
来源:转载
供稿:网友

春季要进行实习招聘了,趁着假期把之前在FCC上做的算法题 review一下。因为做题的时间久远,加上自身学艺不精,有纰漏的地方望各位斧正。

1.Reverse a String

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

function reverseString(str) {   return str.split("").reverse().join("");}reverseString("hello");思路: 使用String.split()方法将目标字符串每个字符分割,转换为数组,使用Array.reverse()方法转置数组,在使用Array.join()方法,将数组中每个字符拼凑转换为字符串。2.Factorialize a Number 计算一个整数的阶乘,如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积,n阶乘通常简写成n!例如:5! = 1 * 2 * 3 * 4 * 5 = 120
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"

function palindrome(str) {  // Good luck!    var re = /[^0-9a-zA-Z]/gi;  str = str.replace(re,"");  return str.toLowerCase()===str.split("").reverse().join("").toLowerCase();}palindrome("eye");思路:主要思路与第一题相似,判断原字符串是否与转置后字符串相等。先利用正则表达式去除大小写字母,数字以外的字符,然后全部转换为小写后判断是否与转置转换小写后相等。4.Find the Longest Word in a String找到提供的句子中最长的单词,并计算它的长度。函数的返回值应该是一个数字。

function findLongestWord(str) {  var myArr = str.split(" ");  var longest = 0;  for(var i=0 ; i<myArr.length;i++){    if(myArr[i].length>longest){      longest = myArr[i].length;    }  }  return longest;}findLongestWord("The quick brown fox jumped over the lazy dog");

思路:先将句子字符串通过空格分隔符转换为数组,然后遍历数组,不停更新最长值。遍历完成后返回最长值。

5.Title Case a Sentence

确保字符串的每个单词首字母都大写,其余部分小写。像'the'和'of'这样的连接符同理。

function titleCase(str) {  return str.replace(//w/S*/g,function(txt){    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();  });}titleCase("I'm a little tea pot");

思路:利用String.replace对每个单词的首字母进行操作,首先用正则表达式匹配单词,然后用回调函数将每个单词的首字母换为大写。

注意:js的字符串,不能直接使用类似于C语言那种直接通过数组操作字符串中字符的方法,必须通过charAt(location)来操作字符串中的字符。

6.Return Largest Numbers in Arrays

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

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

function largestOfFour(arr) {  // You can do this!  var largest = 0 ;  var largestArr = [];  for(var i=0;i<arr.length;i++){    largest=0;    for(var j=0;j<arr[i].length;j++){      if(arr[i][j]>largest){        largest = arr[i][j];        largestArr[i]=arr[i][j];      }    }  }  return largestArr;}largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

思路:这题EZ,遍历即可,不做过多解释。

7.Confirm the Ending

检查一个字符串(str)是否以指定的字符串(target)结尾。

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

function confirmEnding(str, target) { 	confirmEnding("Bastian", "n");	return str.substr(-target.length)===target; } 思路:EZ,这题主要用到当String.substr(num)中num为负值的特性————从末尾向前去abs(num)个字符。扩展:String,substr()传入的第一个负数参数=> String.length+num, 会将传入的第二个负数参数变为0。    String.slice()会将所有的负数参数=> String.length+num    String.SubString()会将 所有的负值变为0。8.Repeat a string repeat a string重要的事情说3遍!重复一个指定的字符串num次,如果num是一个负数则返回一个空字符串。

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

9.Truncate a string 

用瑞兹来截断对面的退路!

截断一个字符串!

如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。

切记,插入到字符串尾部的三个点号也会计入字符串的长度。

但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

function truncate(str, num) {   if(str.length>num&&str.length>3){     if(num>3){     str=str.slice(0,num-3);     str+="...";     }else {       str.slice(0,num);       str+="...";     }   }else if(num<=3){     str=str.slice(0,num);     str+="...";   }  return str;}truncate("Absolutely Longer", 2);思路:条件分支,简单题,但是在页面上经常用到,用来省略页面上较长的文字信息。

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 newArr=[];  for(i=0;i<arr.length;i+=size){    newArr.push(arr.slice(i,i+size));   }  return newArr;}chunk(["a", "b", "c", "d"], 2);

12.Slasher Flick

打不死的小强!

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

function slasher(arr, howMany) {  // it doesn't always pay to be first  return arr.slice(howMany);}slasher([1, 2, 3], 2);

13.Mutations

蛤蟆可以吃队友,也可以吃对手。

如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。

["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。

["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。

function mutation(arr) {  var flag = true ;  for(var i=0;i<arr[1].length;i++){    if(arr[0].toLowerCase().indexOf(arr[1].charAt(i).toLowerCase())==-1){      flag= false;    }  }  return flag;}思路:使用传入的数组中的第二个字符串中的每个字符,通过String.indexOf()来验证是否存在于第一个字符串中。

14.Falsy Bouncer

真假美猴王!

删除数组中的所有假值。

javaScript中,假值有falsenull0""undefinedNaN

function bouncer(arr) {  // Don't show a false ID to this bouncer.  return arr.filter(Boolean);}bouncer([1, null, NaN, 2, undefined]);思路:开始特别蠢的用filter()把要剔除的每个值进行判断,后来看提示,发现可以直接用Boolean对象进行过滤,Boolean对象中的值都可以作为filter的判断条件,如果值为假自然被过滤掉了。

15.Seek and Destroy 

二营长,把老子的意大利。。。。面拿出来给大家尝尝

实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。

当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。

function destroyer() {  // Remove all the values var arr = arguments[0];  var fit = [];  for(var i=1;i<arguments.length;i++){    fit.push(arguments[i]);  }  return arr.filter(function(item){    return fit.indexOf(item)<0;  });}destroyer([1, 2, 3, 1, 2, 3], 2, 3); 思路:当函数的参数数量不定时,利用arguments[i]来提取参数,把除了第一个参数以外的参数放入fit数组中,然后利用Array.indexOf(),过滤符合条件的元素。

16.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

function where(arr, num) {  // Find my place in this sorted array.  var index=0;  arr.sort(function(a,b){    return a-b ;  });  while(num>arr[index]){    index++;  }  if (index>0){    return index++;  }else{    return 0;  }}where([40, 60], 50);思路:首先改造Array.sort()方法,因为此方法对数据采用字符串unicode码点排序。然后对排序后的数组进行遍历,查看需要插入的数据的位置。

17.Caesars Cipher

让上帝的归上帝,凯撒的归凯撒。

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

移位密码也就是密码中的字母会按照指定的数量来做移位。

一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。

写一个ROT13函数,实现输入加密字符串,输出解密字符串。

所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。

function rot13(str) { // LBH QVQ VG!  var myArr = [];  var newStr = "";  for(var i=0;i<str.length;i++){    var fuck = str.charCodeAt(i);    if(fuck<=97&&fuck>=65 || fuck<=122&&fuck>=97){      if(fuck-13<65){        fuck+=13;      }else{        fuck-=13;      }  }    myArr.push(fuck);  }  for(var j=0;j<myArr.length;j++){    newStr+=String.fromCharCode(myArr[j]);  }  return newStr; }// Change the inputs below to testrot13("SERR PBQR PNZC");

思路:看懂了需求还是很简单的,请无视变量名。 可以使用reg加String.replace()方法来简化代码。

扩展:fromCharCode() 、charCodeAt()


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表