1. 翻转字符串算法挑战
题目描述:先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,然后把数组转化成字符串。
提示:结果必须得是一个字符串
function reverseString(str) {
var str=str.split("").reverse().join("");
return str;
}
reverseString("hello");
一开始对于split()得理解不到位,它可以直接返回成数组。而join()也可以将数组连接到字符串中。
split() 方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置
reverse() 方法颠倒数组中元素的位置。
join() 方法将数组(或一个类数组对象)的所有元素连接到一个字符串中并返回这个字符串。
const elements = ['Fire', 'Air', 'Water'];
console.log(elements.join()); //"Fire,Air,Water"
console.log(elements.join('')); //"FireAirWater"
console.log(elements.join('-')); //"Fire-Air-Water"
2、回文算法挑战
palindrome(回文)是指一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样。
注意:需要删除字符串多余得标点符号和空格,然后把字符串转化成小写来验证字符串是不是回文
function palindrome(str) {
var newStr=str.replace(/[^0-9a-zA-Z]/gi,"").toLowerCase();//将字符串中的非数字和字母的字符除掉,并转换成小写。
var reverStr=newStr.split("").reverse().join("");//翻转字符串(返回的还是字符串)
if (reverStr==newStr){//验证翻转后的和字符串是否相等
return true
}else {
return false
}
}
palindrome("eye");
涉及到的两个字符串方法:
- String.replace(/正则表达式/,“替换值“);
- String.toLowerCase();将字母变小写
相关的正则表达式:
* ^ 表示的是以什么开始,或者是取非(取反)
^[0-9] 以数字开头
^[a-z] 以小写字母开始
[^0-9] 取反,非数字
[^a-z] 非小写字母
[^0-9a-zA-Z_]非数字大小写字母
* $ 表示的是以什么结束 [0-9][a-z]$ 必须以小写字母结束
正则提取:
// 方法1、str.match();提取工资
var str = "张三:1000,李四:5000,王五:8000。";
var array = str.match(/\d+/g);//”\d“表示数字,g表示全局
console.log(array);
//方法2、str.match();把里面所有的数字全部显示出来
var str="中国移动:10086,中国联通:10010,中国电信:10000";
var array=str.match(/\d{5}/g);
console.log(array);
正则替换:
// 替换所有空白
var str = " 123AD asadf asadfasf adf ";
str = str.replace(/\s/g,"xx");//”\s“表示空白字符,g表示全局
console.log(str);
正则匹配:
// 匹配日期
var dateStr = '2015-10-10';
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/
console.log(reg.test(dateStr));
console.log(/\d{0,}/.test("998"));//true
console.log(/\d{2,3}/.test("998"));//true
console.log(/\D/.test("eat"));//true
3、寻找最长的单词算法挑战
题目描述:返回提供的句子中最长的单词的长度。返回值应该是一个数字。
示例:“ What if we try a super-long word such as otorhinolaryngology ”应该返回 19
function findLongestWord(str) {
var strArr=str.split(" "); //用空格分割字符串,返回到一个数组
var numArr=[]; //新建空数组,用来储存每个字符的长度
for (var i=0;i<strArr.length;i++){
numArr[i]=strArr[i].length;
}
numArr.sort(function(a,b){ //排序(a-b):升序排列;(b-a):降序排列
return a-b;
});
return numArr.pop() //pop()把数组的最后一个元素输出;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
相比网上其他人写的代码,我写的啰嗦了点,但是涉及的知识点还是想要记录下来。
var arr=[1,2,22,3,9,43,80];
console.log(arr.sort()); //输出:[1, 2, 22, 3, 43, 80, 9]
//没有指定compareFunction,比较的数字会先被转换为字符串,所以在Unicode顺序上“80”要比“9”靠前
var newArr=arr.sort(function(a,b){
return a-b;
});
console.log(newArr); //输出:[1, 2, 3, 9, 22, 43, 80] √
4、设置首字母大写算法挑战
题目描述:返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写。
function titleCase(str) {
var newArr=str.toLowerCase().split(" "); //将字符串先都变成小写字母,再以空格符分割开来,返回到数组。
for (var i=0;i<newArr.length;i++){
//将数组内每个字符串的第一个字符变成大写
newArr[i]=newArr[i].charAt(0).toLocaleUpperCase()+newArr[i].slice(1);
}
console.log(newArr);
return newArr.join(" "); //将数组保存为String类型,以空格符连接
}
titleCase("I'm a little tea pot");
知识点:
- 字符串特性:不可变性,字符串的值是不能改变的,字符串的值之所以看起来是改变的,那是因为指向改变了,并不是真的值改变了。所以这里面不能直接使用str[索引]=“值”。
- String.chart(索引);//返回值是指定索引位置的字符串,超出索引,结果是空字符串
- String.slice(开始的索引,结束的索引); //截取一段字符串
5、寻找数组中的最大值算法挑战
题目描述:在一个大数组中包含了4个小数组,请分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新的数组
ps:这个题目比较简单,针对以上第3个题目寻找最大值算是一种方法的补充(这个更简单,不用sort排序)
function largestOfFour(arr) {
var maxArr=[];
for (var i = 0;i<arr.length;i++) {
maxArr[i]=0;
for (var j=0;j<arr[i].length;j++){
if (arr[i][j]>maxArr[i]) {
maxArr[i]=arr[i][j];
}
}
}
return maxArr;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
//返回[5,27,39,1001]
6、确认末尾字符算法挑战
题目描述:检查一个字符串(str)是否以指定的字符串(target)结尾。如果是,返回true;如果不是,返回false。
这个挑战可以通过在ES2015中引入的.endsWith()方法来解决。但是出于这个挑战的目的,我们希望您使用JavaScript子串方法之一。
function confirmEnding(str, target) {
var tarNum=target.length;
var strNum=str.length;
var newStr=str.slice(strNum-tarNum);//slice(开始的索引,结束的索引);提取字符串
if (newStr==target){
return true;
}else {
return false;
}
}
confirmEnding("Bastian", "n"); //true
confirmEnding("He has to give me a new name", "name") //true
confirmEnding("He has to give me a new name", "me") // true.
最开始我想用正则匹配来做,但是正则匹配/正则表达式/不能间接的传入,就是/[target]¥/它匹配的是“target”这个字符。×
7、数组查询算法挑战
题目描述:如果数组第一个字符串元素包含了第二个字符串元素的所有字符,则函数返回true。
举例:
[“hello”, “Hello”]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
[“hello”, “hey”]应该返回false,因为字符串"hello"并不包含字符"y"。
[“Alien”, “line”]应该返回true,因为"line"中所有字符都可以在"Alien"找到。
function mutation(arr) {
var arr=arr.join(",").toLowerCase().split(",");
var tag=false; //给定一个变量
for (var i=0;i<arr[1].length;i++){
//.indexOf(元素值);返回的是索引,没有则是-1
if(arr[0].indexOf(arr[1][i])==-1){
return false
}else {
tag=true //这边不直接返回,等所有的字母都遍历过以确保所有的字母都可以查询到。
}
}
return tag
}
mutation(["hello", "hey"]);
8、删除数组中特定值算法挑战
题目描述:删除数组中的所有的假值。在JavaScript中,假值有false、null、0、""、undefined 和 NaN
function bouncer(arr) {
return arr.filter(function (element) { //filter()只会返回true项组成的数组
//用Boolean()函数判断,如果它的参数是false,null,0,"",underfined,NaN,那么它的值返回false;
return Boolean(element)
})
}
bouncer([7, "ate", "", false, 9]);
9、位移密码算法挑战
下面我们来介绍著名的凯撒密码Caesar cipher,又叫移位密码。移位密码也就是密码中的字母会按照指定的数量来做移位。一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔’O’,以此类推。如下图所示
题目描述:写一个ROT13函数,实现输入加密字符串,输出解密字符串。所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,就跳过它们。
function rot13(str) {
var newArr=[];
for (var i=0;i<str.length;i++){
//非字母形式直接存入数组中
if (str.charCodeAt(i)<65||str.charCodeAt(i)>90){
newArr.push(str.charAt(i));
}else if (str.charCodeAt(i)>77){
//后13个字母直接减去13
var num1=str.charCodeAt(i)-13;
newArr.push(String.fromCharCode(num1));
} else { //前13个字母加13完成置换
var num2=str.charCodeAt(i)+13;
newArr.push(String.fromCharCode(num2));
}
}
return newArr.join("");
}
rot13("SERR PBQR PNZC"); //FREE CODE CAMP
- String.prototype.chartCode();——方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元
- String.fromCharCode();——方法返回由指定的UTF-16代码单元序列创建的字符串。由于 fromCharCode() 是 String 的静态方法,所以应该像这样使用:String.fromCharCode(),而不是作为你创建的 String 对象的方法。