W3Cschool编程实战——js初级脚本算法

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 对象的方法。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值