春季要进行实习招聘了,趁着假期把之前在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 = 120function 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()
新闻热点
疑难解答