文字描述部分来自W3Cschool
翻转字符串算法挑战
你可以先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,然后把数组转化成字符串。
str.split() 可将String分成有序的子字符串集,将这些子字符串放入数组中,然后返回该数组。
str.reverse() 可将数组进行翻转。
str.join() 通过连接数组(或类似数组的对象)中的所有元素(以逗号或指定的分隔符字符串分隔)来创建并返回新字符串。
function reverseString(str) {
var arr = str.split('').reverse().join('');
return arr;
}
reverseString("HelloWorld");
阶乘算法挑战
如果使用字母n代表一个整数,则阶乘是所有小于或等于n的整数的乘积。
逆向相乘
function factorialize(num) {
if (num == 0) {
return 1;
} else {
for (var i = num - 1; i > 0; i--) {
num = num * i;
}
}
return num;
}
factorialize(5);
回文算法挑战
palindrome(回文)是指一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样。
**注意:**您需要删除字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是不是回文
str.replace() + 正则表达式可替换标点符号和空格
str.toLowerCase() 可将字母转换为小写形式
function palindrome(str) {
var regex = '/\s*/g';
str = str.replace(/\s*/g,'').replace(/[^a-zA-Z0-9]/g,'').toLowerCase();
if (str.split('').reverse().join('') === str) {
return true;
} else {
return false;
}
}
palindrome("My age is 0, 0 si ega ym.");
寻找最长的单词算法挑战
返回提供的句子中最长的单词的长度。
返回值应该是一个数字
将字符串转化为数组,遍历数组中的每个单词得到其长度push进一个新的数组,循环遍历出最大值。
function findLongestWord(str) {
str = str.split(' ');
var arr = [];
for (var i = 0; i < str.length; i++) {
arr.push(str[i].length);
}
var max = arr[0];
for (var j = 1; j < arr.length; j++) {
if (arr[j] > max) {
max = arr[j];
}
}
return max;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
设置首字母大写算法挑战
返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写。
str.charAt() 可返回指定位置的字符。
str.slice() 可从已有的数组中返回选定的元素。
str.toUpperCase() 用于把字符串转换为大写。
function titleCase(str) {
str = str.split(' ');
for (var i = 0; i < str.length; i++) {
str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1).toLowerCase();
}
return str.join(' ');
}
titleCase("sHoRt AnD sToUt");
寻找数组中的最大值算法挑战
在右边的大数组中包含了4个小数组,请分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新的数组。
多维循环遍历,max=[i][0]
function largestOfFour(arr) {
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
var max = arr[i][0];
for (var j = 0; j < arr[i].length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
}
}
arr1.push(max);
}
return arr1;
}
largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
确认末尾字符算法挑战
检查一个字符串(str
)是否以指定的字符串(target
)结尾。
如果是,返回true
;如果不是,返回false
。
这个挑战可以通过在ES2015中引入的.endsWith()
方法来解决。但是出于这个挑战的目的,我们希望您使用JavaScript子串方法之一。
str.substring(m,n) m为起始位置,n为结束位置
str.slice(m,n) m为起始位置,n为结束位置
str.endsWith() 可判断以什么结尾
function confirmEnding(str, target) {
if (str.slice(str.length-target.length) == target) {
// if (str.substring(str.length-target.length,str.length) == target)
// if (str.endsWith(target))
return true;
} else {
return false;
}
}
confirmEnding("Bastian", "n");
重复操作算法挑战
循环拼接一个指定的字符串 num
次,如果num
是一个负数,则返回一个空字符串。
str.repeat(count) 字符串被循环拼接count次
function repeat(str, num) {
if (num > 0) {
return str.repeat(num);
} else {
return '';
}
}
repeat("abc", 3);
字符串截取算法挑战
如果字符串的长度比给定的参数num
长,则把多余的部分用...
来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
然而,如果指定的参数num
小于或等于3,则添加的三个点号不会计入字符串的长度
function truncate(str, num) {
if (str.length > num) {
if (num > 3) {
str = str.slice(0,num-3) + "...";
} else {
str = str.slice(0,num) + "...";
}
}
return str;
}
truncate("Peter Piper picked a peck of pickled peppers", 14);
数组分割算法挑战
编写一个函数,把一个数组arr
按照指定的数组大小size
分割成若干个数组块。
arr.splice() 向/从数组中添加/删除项目,然后返回被删除的项目。
function chunk(arr, size) {
var arr1 = [];
// 方法一
for (var i = 0; i <arr.length ; i+=size) {
arr1.push(arr.slice(i,i+size));
}
// 方法二
while(arr.length>0){
arr1.push(arr.splice(0,size));
}
return arr1;
}
chunk(["a", "b", "c", "d"], 2);
数组截断算法挑战
返回一个数组被截断n
个元素后还剩余的元素,从索引0开始截断。
arr.slice() 和 arr.splice() 都可用于截取数组元素
function slasher(arr, howMany) {
// 方法一
arr = arr.slice(howMany);
// 方法二
arr = arr.splice(howMany);
return arr;
}
slasher([1, 2, 3], 9);
数组查询算法挑战
如果数组第一个字符串元素包含了第二个字符串元素的所有字符,则函数返回true
。
遍历arr[1]中所有的字符,确定第一个字符串包含第二个字符串所有字符
arr.indexOf(searchvalue,fromindex) 该方法将从头到尾地检索字符串 stringObject,看它是否含有子串 searchvalue。开始检索的位置在字符串的 fromindex 处或字符串的开头(没有指定 fromindex 时)。如果找到一个 searchvalue,则返回 searchvalue 的第一次出现的位置。stringObject 中的字符位置是从 0 开始的。
indexOf() 方法对大小写敏感!
function mutation(arr) {
for (var i = 0; i < arr[1].length; i++) {
if (arr[0].toLowerCase().indexOf(arr[1].charAt(i).toLowerCase()) == -1) {
return false;
}
}
return true;
}
mutation(["hello", "hey"]);
删除数组中特定值算法挑战
删除数组中的所有的假值。
在JavaScript中,假值有false
、null
、0
、""
、undefined
和 NaN
。
arr.filter()
如果Boolean构造函数的参数不是一个布尔值,则该参数会被转换成一个布尔值.如果参数是0,-0,null,false,NaN,undefined, 或者空字符串 (""),生成的Boolean对象的值为false. 其他任何值,包括任何对象或者字符串"false", 都会创建一个值为true的Boolean对象。
function bouncer(arr) {
return arr.filter(Boolean);
}
bouncer([7, "ate", "", false, 9]);
去除数组中任意多个值算法挑战
实现一个 destroyer
函数,第一个参数是初始数组,后跟一个或多个参数。从初始数组中删除与这些参数具有相同值的所有元素。
arguments 是函数内部可访问的类似数组的对象,其中包含传递给该函数的参数的值。
function destroyer(arr) {
for (var i = 1; i < arguments.length; i++) {
arr = arr.filter(item => item!= arguments[i]);
}
return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
数组排序并插入值算法挑战
先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
arr.sort() 用于对数组的元素进行排序.如果调用该方法时没有使用参数,将按字符编码顺序对数组中的元素进行排序。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
function where(arr, num) {
arr.push(num);
function sortNumber(a,b){
return a - b;
}
arr.sort(sortNumber);
return arr.indexOf(num);
}
where([20,3,5], 19);
位移密码算法挑战
下面我们来介绍著名的凯撒密码Caesar cipher
,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔’O’,以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,就跳过它们。
str.charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
方法 charCodeAt() 与 charAt() 方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。
String.fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
function rot13(str) {
var arr = [];
for (var i = 0; i < str.length; i++) {
var num = str[i].charCodeAt();
if (num >= 65 && num <= 77) {
num += 13;
} else if(num > 77 && num <91) {
num -= 13;
}
arr.push(String.fromCharCode(num));
}
return arr.join("");
}
rot13("SERR CVMMN!");