一、翻转字符串 ( Reverse a String )
例子:reverseString(“hello”) //返回 “olleh”
代码
//递归算法
function reverseString(str) {
return str.length ? reverseString(str.substr(1))+str.charAt(0) : "";
}
reverseString("hello");
二、阶乘 ( Factorialize a Number )
例子: 5! = 1 * 2 * 3 * 4 * 5 = 120
代码
//递归算法
function factorialize(num) {
return num !== 0 ? num * factorialize(num-1) : 1;
}
/*
//for循环
function factorialize(num) {
var result = 1;
for (var i=2; i<=num; i++) {
result *= i;
}
return result;
}
*/
factorialize(5);
三、检查回文字符串 ( Check for Palindromes )
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。 例子:palindrome(“race car”) //返回 true.
代码
function palindrome(str) {
str = str.replace(/[\W_]/g, "").toLowerCase();
return str.split("").reverse().join("") === str;
}
/*
// for 循环
function palindrome(str) {
str = str.replace(/[\W_]/g,"").toLowerCase();
var stop = str.length-1;
for (var i=0; i<stop/2; i++) {
if (str.charAt(i) !== str.charAt(stop-i)) return false;
}
return true;
}
//递归算法
function palindrome(str) {
str = str.replace(/[\W_]/g,"").toLowerCase();
if (str.length<2) return true;
if (str[0]===str[str.length-1]) return palindrome(str.slice(1,str.length-1));
return false;
}
*/
palindrome("eye");
四、找出最长单词 ( Find the Longest Word in a String )
在句子中找出最长的单词,并返回它的长度。 例子: findLongestWord(“The quick brown fox jumped over the lazy dog”) //返回 6
代码
function findLongestWord(str) {
return str.split(' ').reduce(function(acc, curr) {
return Math.max(acc, curr.length);
}, 0);
}
findLongestWord("The quick brown fox jumped over the lazy dog");
五、句中单词首字母大写 ( Title Case a Sentence )
确保字符串的每个单词首字母都大写,其余部分小写。 例子: titleCase(“I’m a little tea pot”) //返回 “I’m A Little Tea Pot”. ####代码
function titleCase(str) {
return str.split(' ').map(function(val){
return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
}).join(' ');
/*
// replace+正则
return str.replace(/\w\S*/g, function(word) {
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
});
*/
}
titleCase("I'm a little tea pot");
六、找出多个数组中的最大数 ( Return Largest Numbers in Arrays )
例子: largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) //返回 [27,5,39,1001]
代码
// 递归
const largestOfFour = arr => arr.length>0 ? [Math.max.apply(null, arr.shift())].concat(largestOfFour(arr)) : [];
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
七、检查字符串结尾 ( Confirm the Ending )
判断一个字符串(str)是否以指定的字符串(target)结尾。 例子: confirmEnding(“He has to give me a new name”, “name”) //返回 true
代码
function confirmEnding(str, target) {
return str.substr(-target.length) === target;
}
confirmEnding("Bastian", "n");
八、重复输出字符串 ( Repeat a string repeat a string )
重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。 例子: repeat("", 3) //返回 "**"
代码
// 递归
function repeat(str, num) {
return num > 0 ? str + repeat(str, num-1) : "";
}
repeat("abc", 3);
九、截断字符串 ( Truncate a string )
( 用瑞兹来截断对面的退路 ) 如果字符串的长度比指定的参数num长,则把多余的部分用…来表示。但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。 例子: truncate(“A-tisket a-tasket A green and yellow basket”, 11) //返回 “A-tisket…”
代码
function truncateString(str, num) {
if (str.length > num) {
if (num <= 3) str = str.substr(0,num);
else str = str.substr(0,num-3);
str += '...';
}
return str;
}
truncateString("Absolutely Longer", 2);
十、分割数组
把一个数组arr按照指定的数组大小size分割成若干个数组块。 例子: chunk([“a”, “b”, “c”, “d”], 2) //返回 [[“a”, “b”], [“c”, “d”]]
代码
function chunk(arr, size) {
var result = [], i=0;
while (i<arr.length) result.push(arr.slice(i,i+=size));
return result;
}
chunk(["a", "b", "c", "d"], 2);
十一、截断数组
返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。 例子: slasher([1, 2, 3], 2) //返回 [3]
代码
function slasher(arr, howMany) {
return arr.length < howMany ? [] : arr.slice(howMany);
}
slasher([1, 2, 3], 0);
十二、比较字符串 ( Mutations )
如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。 例子: mutation([“Mary”, “Army”]) //返回 true
代码
function mutation(arr) {
var str0 = arr[0].toLowerCase();
var str1 = arr[1].toLowerCase();
return Array.prototype.every.call(str1,function(val){
return str0.indexOf(val)>-1;
});
}
mutation(["hello", "hey"]);
十三、过滤数组假值 ( Falsy Bouncer )
删除数组中的所有假值。在JavaScript中,假值有false、null、0、""、undefined 和 NaN。 例子: bouncer([7, “ate”, “”, false, 9]) //返回 [7, “ate”, 9]
代码
function bouncer(arr) {
return arr.filter(function(val){return val;});
}
bouncer([7, "ate", "", false, 9]);
十四、摧毁数组 ( Seek and Destroy )
金克斯的迫击炮! 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。 例子: destroyer([1, 2, 3, 1, 2, 3], 2, 3) //返回 [1, 1]
代码
function destroyer(arr) {
var args = [];
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
return arr.filter(function(val) {
return args.indexOf(val)===-1;
});
}
/*
function destroyer(arr) {
// 转换数组
var thisArg = Array.prototype.slice.apply(arguments);
thisArg.shift();
return arr.filter(function(val) {
return thisArg.indexOf(val) === -1;
});
}
*/
destroyer(["tree", "hamburger", 53], "tree", 53);
十五、数组排序并找出元素索引 ( Where do I belong )
先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。 例子: where([10, 20, 30, 40, 50], 35) //返回 3
代码
function where(arr, num) {
return arr.reduce(function(prev, curr){
return curr<num ? prev+1 : prev;
},0);
/*
// 数组的 sort 函数的使用
if (arr.indexOf(num) === -1) {
arr.push(num);
}
arr.sort(function(a, b){
return a - b;
});
return arr.indexOf(num);
*/
}
where([40, 60], 50);
十六、凯撒密码 ( Caesars Cipher )
移位密码也就是密码中的字母会按照指定的数量来做移位。一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔ ‘O’,以此类推。 例子: rot13(“SERR PBQR PNZC”) \解码为 “FREE CODE CAMP”
代码
function rot13(str) {
var Acode = "A".charCodeAt(0);
var Zcode = "Z".charCodeAt(0);
var NUMLETTERS = Zcode-Acode+1;
return str.replace(/[A-Z]/g,function(char){
var cc = char.charCodeAt(0);
if (cc>=Acode && cc<=Zcode) {
cc += 13;
if (cc>Zcode) cc-=NUMLETTERS;
}
return String.fromCharCode(cc);
});
}
/*
function rot13(str) {
return str.split("").map(function(char){
var cc = char.charCodeAt(0);
return (cc>64 && cc<91) ? String.fromCharCode(cc%26+65) : char;
}).join("");
}
*/
// Change the inputs below to test
rot13("SERR PBQR PNZC");