春季要进行实习招聘了,趁着假期把之前在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中,假值有
false
、null
、0
、""
、undefined
和NaN
。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()
新闻热点
疑难解答