FreeCodeCamp中文社区刷题答案及笔记
一、Reverse a String
翻转字符串
先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
你的结果必须得是一个字符串
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
这是一些对你有帮助的资源:
Global String Object
String.split
Array.reverse
Array.join
function reverseString(str) {
// 请把你的代码写在这里
var strToArray = str.split('');
//return strToArray; //["h", "e", "l", "l", "o"]
//var strToArray = str.split(' '); //["hello"],一个个单词
var reverseArray = strToArray.reverse();
//return reverseArray; //["o", "l", "l", "e", "h"]
var arrayToStr = reverseArray.join('');
return arrayToStr;
}
// reverseString("hello"); //[olleh]
reverseString("Hello, how are you?");
//若是使用split(' ')和join(' '),则返回结果为"you? are how Hello,"
二、Check for Palindromes(检查是否为回文)
检查回文字符串
如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
函数参数的值可以为”racecar”,”RaceCar”和”race CAR”。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
function palindrome(str) {
// 请把你的代码写在这里
var strToLowerCase = str.toLowerCase(); //把字符串转换为小写
//return newStr;
var strToArray = strToLowerCase.split(''); //把字符串转换为数组
//return strToArray;
//过滤字符串中的标点符号和空格
var newArray = strToArray.filter(function(val) {
return (val !== " " && val !== "," && val !== "." && val !== "?" && val !== ":" && val !== ";" && val !== "`" && val !== "'" && val !== "_" && val !== "/" && val !== "-" && val !== "\\" && val !== "" && val !== "\(" && val !== "\)" && val !== "!");
});
//return newArray;
//把过滤后的数组转换回字符串
var toString = newArray.join('');
//return toString;
//判断是否为回文
for(var i=0, j=toString.length-1; i<j; i++, j--) {
if(toString[i] !== toString[j]) {
return false;
}
}
return true;
}
palindrome("eyerar"); //false
三、Find the Longest Word in a String(找出句子中长度最大的单词)
找出最长单词
在句子中找出最长的单词,并返回它的长度。
函数的返回值应该是一个数字。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
//找出一个句子中最长的单词,并返回其长度
function findLongestWord(str) {
//把句子分割为单词数组
var strToArray = str.split(' ');
//return strToArray;
//找出数组中长度最大的单词
var everyLength = [];
for(var i = 0; i < strToArray.length; i++) {
everyLength.push(strToArray[i].length);
}
//return everyLength; //[3, 5, 5, 3, 6, 4, 3, 4, 3]
//把数组中元素排序
var sortEveryLength = everyLength.sort(function(a, b) {
return a - b;
});
//return sortEveryLength; //[3, 3, 3, 3, 4, 4, 5, 5, 6]
//返回排序后的数组的最后一项(即长度最大项)
return sortEveryLength[sortEveryLength.length-1]; //6
}
findLongestWord("The quick brown fox jumped over the lazy dog");
四、Title Case a Sentence(把句子每个单词首字母大写)
要点:slice()方法
slice()方法介绍
slice() 方法可从已有的数组中返回选定的元素。
array.slice(start, end);
参数 | 说明 |
---|---|
start | 可选。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。 |
end | 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。 |
slice()方法返回一个新的数组,包含从start到end (不包括该元素)的 元素。
String.slice(start,end)
var s = "abcdefg";
s.slice(0,4) // Returns "abcd"
s.slice(2,4) // Returns "cd"
s.slice(4) // Returns "efg"
s.slice(3,-1) // Returns "def"
s.slice(3,-2) // Returns "de"
s.slice(-3,-1) // Should return "ef"
Array.slice(start,end)
返回从start开始到end的子数组,如果end这个参数没有被设置,则返回从start开始到最后的数组元素。
var a = [1,2,3,4,5];
a.slice(0,3); // Returns [1,2,3]
a.slice(3); // Returns [4,5]
a.slice(1,-1); // Returns [2,3,4]
a.slice(-3,-2); // Returns [3]
回归本题题目
句中单词首字母大写
确保字符串的每个单词首字母都大写,其余部分小写。
像’the’和’of’这样的连接符同理。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
//把句子的每个单词首字符大写
function titleCase(str) {
//把句子分割为单词数组
var toWordArray = str.split(' ');
//return toWordArray;
//遍历数组,把每个单词首字母变为大写
var newArray = [];
for(var i=0; i<toWordArray.length; i++) {
newArray[i] = toWordArray[i].slice(0,1).toUpperCase() + toWordArray[i].slice(1).toLowerCase();
}
//return newArray; //["T'm", "A", "Little", "Tea", "Pot"]
//把新数组转换为字符串
var newString = newArray.join(' ');
return newString;
}
titleCase("I'm a little tea pot");
/*titleCase("sHoRt AnD sToUt"); //Short And Stout */
五、Return Largest Numbers in Arrays(找出二维数组包含的每个子数组的最大数并重组为一个新数组)
找出多个数组中的最大数
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
//找出每个小数组中的最大数并重组成一个新数组
function largestOfFour(arr) {
var maxArr = []; //接收找出的每个数组的最大数
for(var i=0; i<arr.length; i++) {
var max = arr[i][0];
for(var j = 1; j < arr[i].length; j++) {
if(max < arr[i][j]) {
max = arr[i][j];
}
}
maxArr[i] = max;
}
return maxArr;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); //[5, 27, 39, 1001]
注:此外的返回数组中的最大最小值的方法还有(使用apply将数组传入max方法中直接返回)
var a = [1, 2, 3, 4, 5, 6];
var max = Math.max.apply(null, a); //6
var min = Math.min.apply(null, a); //1
所以,本题的解答还可以如下:
//找出每个小数组中的最大数并重组成一个新数组
function largestOfFour(arr) {
var maxArr = []; //接收找出的每个数组的最大数
for(var i=0; i<arr.length; i++) {
maxArr[i] = Math.max.apply(null, arr[i]);
}
return maxArr;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
六、Confirm the Ending(检查字符串是否以某个指定的字符串结尾)
检查字符串结尾
判断一个字符串(str)是否以指定的字符串(target)结尾。
如果是,返回true;如果不是,返回false。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
这是一些对你有帮助的资源:
substr()方法介绍
substr() 方法返回一个字符串中从指定位置开始到指定字符数的字符。
语法:str.substr(start, length)
参数 | 说明 |
---|---|
start | 开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。 |
length | 可选。提取的字符数(字符串长度)。如果忽略 length,则 substr 提取字符,直到字符串末尾。 |
start
是一个字符的索引。首字符的索引为 0,最后一个字符的索引为 字符串的长度减去1。
substr
从start 位置开始提取字符,提取
length
个字符(或直到字符串的末尾)。
如果 start
为正值,且大于或等于字符串的长度,则 substr
返回一个空字符串。
如果 start
为负值,则 substr
把它作为从字符串末尾开始的一个字符索引。如果 start
为负值且abs(start)
大于字符串的长度,则 substr 使用 0 作为开始提取的索引。注意负的 start 参数不被 Microsoft JScript 所支持。
如果 length
为 0 或负值,则substr
返回一个空字符串。如果忽略length
,则 substr
提取字符,直到字符串末尾。
示例
var str = "abcdefghij";
console.log("(1,2): " + str.substr(1,2)); // (1,2): bc
console.log("(-3,2): " + str.substr(-3,2)); // (-3,2): hi
console.log("(-3): " + str.substr(-3)); // (-3): hij
console.log("(1): " + str.substr(1)); // (1): bcdefghij
console.log("(-20, 2): " + str.substr(-20,2)); // (-20, 2): ab
console.log("(20, 2): " + str.substr(20,2)); // (20, 2):
好了,知识准备好了,可以开始做题罗!
//判断一个字符串(str)是否以指定的字符串结尾
/*
本人思路为:计算出函数中的指定字符串target的长度length,
然后在字符串str中从字符串结尾处开始查找长度为length的字符串,
比较该字符串是否与target相等,相等返回TRUE,否则返回FALSE
*/
function confirmEnding(str, target) {
var targetLength = target.length; //计算target字符串的长度
//return targetLength; //3
var findSubstr = str.substr(str.length-targetLength, targetLength);
//return findSubstr; //ian
//比较查找出的字符串是否等于给定的字符串target
for(var i=0; i<targetLength; i++) {
if(target[i] !== findSubstr[i]) {
return false;
}
}
return true;
}
confirmEnding("Bastian", "ian");
七、Repeat a string repeat a string(重复输出字符串)
重复输出字符串
(重要的事情说3遍)
重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
//重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。
function repeat(str, num) {
if(num < 0) {
return "";
}
var newString = "";
for(var i=0; i<num; i++) {
newString = newString.concat(str);
}
return newString;
}
repeat("abc", 3); //abcabcabc