FreeCodeCamp中文社区刷题答案及笔记
一、Truncate a string(截断字符串)
截断字符串
(用瑞兹来截断对面的退路)
如果字符串的长度比指定的参数num长,则把多余的部分用…来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
/*
个人思路:对给定的字符串,保留前num位,其余的用...代替,
如果num<=3,则保留前num位,其余的用...代替
如果num > 3,则保留前num-3位,其余的用...代替
如果num >= str.length, 则返回str本身
*/
function truncate(str, num) {
var newString = "";
//如果num<=3,则保留前num位,其余的用...代替
if(num <= 3) {
newString = str.slice(0, num).concat("...");
return newString;
}
//如果num >= str.length, 则返回str本身
if(num >= str.length) {
newString = str;
return newString;
}
//如果num > 3,则保留前num-3位,其余的用...代替
else if(num > 3) {
newString = str.slice(0, num - 3).concat("...");
return newString;
}
}
truncate("A-tisket a-tasket A green and yellow basket", 50);
二、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]];
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
要点:Array.slice()和Array.push()
/*
个人思路:把数组按照给定的size划分成一个个子数组,最终返回结果为一个新数组
*/
function chunk(arr, size) {
// 请把你的代码写在这里
var newArray = [];
//var newArrayLength = Math.floor(arr.length / size) + arr.length % size; //计算新数组的长度
//return newArrayLength;
for(var i=0; i<arr.length; i+=size) {
newArray.push(arr.slice(i, i+size));
}
return newArray;
}
chunk(["a", "b", "c", "d"], 3); //[["a", "b", "c"], ["d"]]
chunk(["a", "b", "c", "d"], 2); //[["a", "b"], ["c", "d"]]
三、Slasher Flick(截断数组)
截断数组
返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
这是一些对你有帮助的资源:
Array.slice()
Array.splice()
要点:splice()方法
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
该方法会改变原始数组。
splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。
如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。
1.删除——用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数)。
2.插入——向数组指定位置插入任意项元素。三个参数,第一个参数(插入位置),第二个参数(0),第三个参数(插入的项)。
3.替换——-向数组指定位置插入任意项元素,同时删除任意数量的项,三个参数。第一个参数(起始位置),第二个参数(删除的项数),第三个参数(插入任意数量的项)。
//返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
function slasher(arr, howMany) {
// 请把你的代码写在这里
var newArray = [];
if(howMany > arr.length) { //若给定的长度大于数组的长度则返回空数组
newArray = [];
return newArray;
}
newArray = arr.slice(howMany);
return newArray;
}
slasher([1, 2, 3], 2);
四、Mutations(indexOf() 方法)
比较字符串
(蛤蟆可以吃队友,也可以吃对手)
如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
举例,["hello", "Hello"]
应该返回truetrue
,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
["hello", "hey"]
应该返回false
,因为字符串"hello"
并不包含字符”y”。
["Alien", "line"]
应该返回true
,因为line中所有字符都可以在”Alien”找到。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
要点:string.indexOf()方法
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
如果没有找到匹配的字符串则返回 -1。
注意: indexOf() 方法区分大小写。
string.lastIndexOf()方法
lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
//如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
function mutation(arr) {
var newArr1 = arr[0].toLowerCase();//转换为小写
var newArr2= arr[1].toLowerCase();
//判断第二个字符串中的所有元素是否都能在第一个字符串中找到
for(var i=0; i < newArr2.length; i++) {
if(newArr1.indexOf(newArr2[i]) == -1) {
return false;
}
}
return true;
}
mutation(["hello", "hey"]); //false
mutation(["Mary", "Aarmy"]); //true
五、Falsy Bouncer(Filter()方法)
过滤数组假值
(真假美猴王)
删除数组中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined 和 NaN。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
这是一些对你有帮助的资源:
Boolean Objects
Array.filter()
Filter()方法:
filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
filter() 对数组中的每个元素都执行一次指定的函数(callback),并且创建一个新的数组, 该数组元素是所有回调函数执行时返回值为 true 的原数组元素。它只对数组中的 非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽略,同时,新创建的 数组也不会包含这些元素。
回调函数可以有三个参数:当前元素,当前元素的索引和当前的数组对象。
var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result); //["exuberant", "destruction", "present"]
//过滤数组假值, 在JavaScript中,假值有false、null、0、""、undefined 和 NaN。
function bouncer(arr) {
// 请把你的代码写在这里
return arr.filter(Boolean);
}
bouncer([7, "ate", "", false, 9]);
六、Seek and Destroy(Arguments,Filter())
摧毁数组
金克斯的迫击炮!
实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
这是一些对你有帮助的资源:
Arguments object
Array.filter()
//删除数组中指定的值,然后返回一个新数组
function destroyer(arr) {
// 请把你的代码写在这里
//Arguments对象检查参数个数
var numberOfArguments = arguments.length;
//return numbebrOfArguments //3
//把第一个参数后的内容移进一个新数组
var newArray1 = [];
for(var i=1; i<arguments.length; i++) {
newArray1.push(arguments[i]);
}
//return newArray1; //[2, 3]
//过滤出第一个数组里在新数组newArray1中的元素,返回一个新数组
var newArray2 = [];
newArray2 = arr.filter(function(arr) {
return newArray1.indexOf(arr) < 0;
});
return newArray2;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3); //[1, 1]
七、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。
当你完成不了挑战的时候,记得开大招’Read-Search-Ask’。
//先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
function where(arr, num) {
//数组排序并返回一个新数组
var newArray = [];
newArray = arr.sort(function(a, b) {
return a - b;
});
//return newArray; [2, 5, 6, 12]
//插入num并返回正确的索引
if(num > newArray[newArray.length - 1]) {
return newArray.length;
}
for(var i=0; i< newArray.length; i++) {
if(newArray[i] >= num) {
return i;
}
}
}
where([2, 12, 6, 5], 8); //3
八、Caesars Cipher(凯撒密码)
凯撒密码
(让上帝的归上帝,凯撒的归凯撒)
下面我们来介绍风靡全球的凯撒密码Caesar cipher
,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔ ‘O’,以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
当你完成不了挑战的时候,记得开大招'Read-Search-Ask'
。
这是一些对你有帮助的资源:
charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元
String.fromCharCode()
静态 String.fromCharCode()
方法返回使用指定的Unicode值序列创建的字符串
//String.charCodeAt()返回指定索引处字符对应的ASCII编码值
//String.fromCharCode(num1, num2, ..., numn)返回给定ASCII码所对应的字符串
//写一个ROT13函数,实现输入加密字符串,输出解密字符串。
function rot13(str) { // LBH QVQ VG!
// 请把你的代码写在这里
//arr1 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
//arr2 = ["N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"];
var arr = str.split('');
//eturn arr; // ["S","E","R","R","","P","B","Q","R","","P","N","Z","C"]
for(var i=0; i<arr.length; i++) {
var num1= arr[i].charCodeAt(0); //输入的加密字符的CII编码值
if(num1>=65 && num1<=90) { //判断是否为字符
if(num1>=65 && num1<=77) {
arr[i] = String.fromCharCode(num1+13);
}else if(num1>=78&& num1<=90) {
arr[i] = String.fromCharCode(num1-13);
}
}else { //若不是字符串,则不发生变化
arr[i] = arr[i];
}
}
str = arr.join('');
return str;
}
rot13("SERR PBQR PNZC"); // 你可以修改这一行来测试你的代码