JS的初级脚本算法
一、 JS 翻转字符串的方法
要求: reverseString("hello")
应该返回 "olleh"
.
首先我们需要使用JS的以下方法:
- split(’#’) 方法将字符串对象拆分为字符串数组,使用指定的分隔符字符串 # 来确定每次拆分的位置。 split()方法的相关内容
- reverse() 将阵列反转到位。第一个数组元素成为最后一个,最后一个数组元素成为第一个。 reverse()方法的相关内容
- join(’#’) 方法通过连接数组(或类数组对象)中的所有元素(由指定的分隔符字符串 # 分隔)来创建并返回新字符串。 join()方法的相关内容
代码如下:
function reverseString(str) {
/*首先将字符串拆分成数组;然后将该数组进行翻转,最后将数组合并为新的字符串*/
return str.split('').reverse().join('');
}
二、 JS 阶乘算法
要求: 计算所提供整数的阶乘。factorialize(10)
应该返回 3628800.
我们可以直接使用递归的方法实现阶乘运算。
代码如下:
function factorialize(num) {
if(num===0||num===1){
return 1;
}
else{
/* 递归调用该方法 */
return num*factorialize(num-1);
}
}
三、 JS 回文算法
要求: 如果给定的字符串是回文,返回true
,反之,返回false
。
palindrome("race car")
应该返回 true.
palindrome("not a palindrome")
应该返回 false.
首先我们得了解回文的定义:palindrome(回文)是指一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样。这也就意味着我们翻转该字符串之后得到相同的字符串,于是我们可以采用翻转字符串的算法来辅助实现该算法,并且我们需要了解正则表达式。
代码如下:
function palindrome(str) {
//将原先的字符串里所有标点符号和空格去掉并转换为小写得到字符串init_str
let init_str = str.replace(/[^0-9a-z]/gi,"").toLowerCase();
//再将该字符串进行拆分、翻转、合并得到新的字符串new_str
let new_str = init_str.split('').reverse().join('');
if(init_str===new_str){
//如果两个字符串相等说明是回文
return true;
}else{
return false;
}
}
四、 JS 设置首字母大写算法
要求: 返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写。即titleCase("sHoRt AnD sToUt")
应该返回 “Short And Stout”.
首先我们需要使用JS的以下方法:
- slice(begin_index[,end_index]) 方法提取字符串从begin_index到end_index位置上的部分,默认end_index是字符串结尾处,并返回一个新的字符串,且不会改动原字符串。 String.slice()方法的相关内容
- toUpperCase()方法将字母变成大写 。 toUpperCase()方法的相关内容
- toLowerCase()方法将字母变成小写 。 toLowerCase()方法的相关内容
代码如下:
function titleCase(str) {
//将字符长串根据空格拆分成短字符串
let strarr=str.split(" ");
let newstr="";
for(let i=0;i<strarr.length;i++){
//将短字符串的首字母变成大写,其余字母变成小写
strarr[i]=strarr[i].slice(0,1).toUpperCase()+strarr[i].slice(1).toLowerCase();
}
newstr=strarr.join(" ");
return newstr;
}
五、 JS 寻找最长的单词算法
要求: 返回提供的句子中最长的单词的长度。即 findLongestWord("What is the average airspeed velocity of an unladen swallow")
应该返回 8.
首先我们需要使用到length方法求出字符串或是字符数组的长度。
代码如下:
function findLongestWord(str) {
let strarr= str.split(" ");
let strmax=" ";
//strarr是字符数组,用length方法求出的是数组的长度
for(let i=0;i<strarr.length;i++){
//strmax和strarr[i]是字符串,用length方法求出的是字符串的长度
if(strmax.length<=strarr[i].length){
strmax=strarr[i];
}
}
//返回最长单词长度
return strmax.length;
}
六、 JS 寻找数组最大值算法
要求: 请分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新的数组。即largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])
应该返回 [27,5,39,1001]
.
我们需要使用双重for循环遍历数组实现该算法。
代码如下:
function largestOfFour(arr) {
let largenumber=[]; //定义一个新数组存储每个子数组的最大值
let maxnumber=0; //定义一个变量来求出子数组的最大值
for(let i=0;i<arr.length;i++){
for(let j=0;j<arr[i].length;j++){
if(maxnumber<arr[i][j]){
maxnumber=arr[i][j];
}
}
largenumber.push(maxnumber); //将最大值添加到数组中
maxnumber=0; //重新置为0,进行下一轮的比较
}
return largenumber;
}
七、 JS 确认末尾字符算法
要求: 检查一个字符串(str
)是否以指定的字符串(target
)结尾。如果是,返回true;如果不是,返回false。即
confirmEnding("Bastian", "n")
应该返回 true.
confirmEnding("Connor", "n")
应该返回 false.
我们需要使用到endsWith(searchString[,length])方法,它用来判断当前字符串是否是以另外一个给定的子字符串searchString“结尾”的,length作为字符串的长度可选择使用,然后根据判断结果返回 true
或 false
。
代码如下:
方法一:
function confirmEnding(str, target) {
if(str.endsWith(target)){
return true;
}else{
return false;
}
}
方法二:
function confirmEnding(str, target) {
for(let i=1;i<=target.length;i++){
//从原字符串str的尾部开始和目标字符串target的尾部进行逆序匹配
if(str[str.length-i]!==target[target.length-i]){
return false;
}
} //如果一直匹配成功即返回true
return true;
}
八、 JS 字符串截取算法
要求: 如果字符串的长度比给定的参数num
长,则把多余的部分用...
来表示。插入到字符串尾部的三个点号也会计入字符串的长度。然而,如果指定的参数num
小于或等于3,则添加的三个点号不会计入字符串的长度。即
truncate("A-tisket a-tasket green and yellow", 11)
应该返回 “A-tisket…”.
truncate("A-", 1)
应该返回 “A…”.
代码如下:
function truncate(str, num) {
let newstr="";
if(str.length>num){
if(num<=3){
newstr=str.slice(0,num)+"...";
}else{
newstr=str.slice(0,num-3)+"...";
}
}else{
//如果num值大于字符串长度即返回str本身
newstr=str;
}
return newstr;
}
九、 JS 数组分割算法
要求: 把一个数组arr
按照指定的数组大小size
分割成若干个数组块。即chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]]。
代码如下:
function chunk(arr, size) {
let newarr=[];
for(let i=0;i<arr.length;i+=size){
//从数组arr中依次截取size个元素添加到newarr中
newarr.push(arr.slice(i,i+size));
}
return newarr;
}
注意: 该算法使用的 slice()方法 和此前在String类型下使用的方法是不同的方法,此处的slice(begin[,end])方法返回一个新的数组对象,这一对象是一个由 begin
和 end
决定的原数组的浅拷贝(包括 begin
,不包括end
)。原始数组不会被改变。
十、 JS 数组截断算法
要求: 返回一个数组被截断n
个元素后还剩余的元素,从索引0开始截断。即slasher([1, 2, 3], 2)
应该返回 [3]
.
首先我们得了解 splice() 方法,它通过删除或替换现有元素或在适当位置添加新元素来更改数组的内容。
代码如下:
function slasher(arr, howMany) {
if(arr.length>howMany){
//截断数组arr中的0到howMany部分
arr.splice(0,howMany);
}else{
//如果howMany大于数组长度,即截断所有元素
arr.splice(0);
}
return arr;
}
十一、JS 数组查询算法
要求: 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,则函数返回true。即mutation(["hello", "Hello"])
应该返回 true.
mutation(["hello", "hey"])
应该返回 false.
首先我们得了解 indexOf() 方法,它返回字符串第一次出现的指定值的调用对象内的索引。如果未找到该值,则返回 -1。
代码如下:
function mutation(arr) {
//先将两个字符串转换成小写
let str1=arr[0].toLowerCase();
let str2=arr[1].toLowerCase();
//对第二个字符串进行遍历
for(let i=0;i<str2.length;i++){
//如果第二个字符串中的某一元素不在第一个字符串中,即返回false
if(str1.indexOf(str2[i])===-1){
return false;
}
}
//如果匹配均成功,即返回true
return true;
}
十二、JS 删除数组中特定值的算法
要求: 删除数组中的所有的假值(在JavaScript中,假值有false
、null
、0
、""
、undefined
和 NaN
。),即bouncer([7, "ate", "", false, 9])
应该返回 [7, "ate", 9]
.
首先我们得了解Boolean对象,它是布尔值的对象包装器。 Boolean对象的相关内容
然后需要了解 filter() 方法,它创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。即这是一个可以进行筛选的方法。 filter()方法的相关内容
代码如下:
方法 一:
function bouncer(arr) {
//将数组中的元素进行筛选,filter方法里的参数为回调函数
return arr.filter(function(e){
//返回true即将该元素回传给数组arr
return Boolean(e);
});
}
方法二:
function bouncer(arr) {
return arr.filter(T=>Boolean(T)===true)
}
十三、JS 去除数组中任意多个值的算法
要求: 实现一个 destroyer 函数,第一个参数是初始数组,后跟一个或多个参数。从初始数组中删除与这些参数具有相同值的所有元素。即destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3)
应该返回 [1, 5, 1]
.
同样我们需要使用到 filter() 方法进行算法实现,而且我们需要了解 arguments对象,它是一个对应于传递给函数的参数的类数组对象。但它不是一个Array,除了length属性和索引元素之外没有任何Array
属性。
如果调用的参数多于正式声明接受的参数,则可以使用arguments
对象。这种技术对于可以传递可变数量的参数的函数很有用。
代码如下:
function destroyer(arr) {
//将arguments转化为真正的数组
let argArr = Array.from(arguments);
//对数组中的元素进行筛选并定义了一个回调函数
arr=arr.filter(function(num){
//对数组进行遍历和剩下的参数进行匹配
for(let i=1;i<argArr.length;i++){
if(num === argArr[i]){
return false;
}
}
//如果都匹配失败了,说明数组中没有这个值,即返回真
return true;
});
return arr;
}
十四、JS 数组排序并插入值算法
要求: 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。where([5, 3, 20, 3], 5)
应该返回 2
.
首先我们得了解 soft() 方法,它对数组中的元素进行排序,并返回已排序的数组。 soft()方法的相关内容
代码如下:
function where(arr, num) {
//对数组进行顺序排序
arr=arr.sort(function(a,b){
return a-b;
});
//定义指定位置index
let index=0;
for(let i=0;i<arr.length;i++){
if(num<=arr[i]){
//当num恰好小于或等于arr[i]时,在i位置上插入元素num
index=i;
arr.splice(index,0,num);
return index;
}
}
//插入位置为数组最后一个时即返回数组长度
return arr.length;
}
十五、JS 位移密码算法
要求: 凯撒密码Caesar cipher
,又叫移位密码。移位密码也就是密码中的字母会按照指定的数量来做移位。一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔’O’,以此类推。写一个函数,实现输入加密字符串,输出解密字符串。即rot13("SERR PBQR PNZC")
应该解码为 "FREE CODE CAMP"
。
首先我们得了解以下JS的以下方法:
- charCodeAt(index) 方法,它返回0到65535之间的整数,表示给定索引处的UTF-16代码单元。如果返回NAN,则index超出范围。 charCodeAt()方法的相关内容
- fromCharCode(num) 方法,它返回从指定的UTF-16代码单元序列创建的字符串,num是一系列UTF-16代码单元的数字,范围介于0到65535(0xFFFF)之间。 fromCharCode()方法的相关内容
由此我们可以看出,以上两种方法是互逆的,所以可以进行配合使用。
代码如下:
function rot13(str) {
let start="A".charCodeAt(0); //定义字符的开始位置
let end="Z".charCodeAt(0); //定义字符的结束位置
let newstr=[]; //定义一个字符数组,因为无法对字符串中的元素进行修改
for(let i=0;i<str.length;i++){
let index=str.charCodeAt(i); //定义该字符的位置
if(index>=start&&index<=end){ //只有当该字符在A-Z中才会进行改变
if(end>=index+13){
//当该字符往后移位13后仍在A-Z中即添加到字符数组中
newstr.push(String.fromCharCode(index+13));
}else {
//当该字符往后移位13后在A-Z外面即需要重定位在A开始移位,再添加到字符数组中
newstr.push(String.fromCharCode(start+index+12-end));
}
}else{
//如果该字符不在A-Z中即返回该字符
newstr.push(str[i]);
}
}
//最后返回的是字符串,于是使用join('')方法进行合并
return newstr.join("");
}