FreeCodeCamp中文社区刷题答案及笔记(之篇四字符串、数组操作)

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(分割数组)

猴子吃香蕉, 分割数组

(猴子吃香蕉可是掰成好几段来吃哦)

扫描二维码关注公众号,回复: 1918187 查看本文章

把一个数组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'

这是一些对你有帮助的资源:

String.charCodeAt()

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");  // 你可以修改这一行来测试你的代码

猜你喜欢

转载自blog.csdn.net/qq_36595013/article/details/80721976