初级算法练习(W3Cschool脚本算法编程实战)

文字描述部分来自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中,假值有falsenull0""undefinedNaN

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!");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值