JS初级算法

2019-02-27  本文已影响0人  猫晓封浪

判断回文字符串:

如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是 palindrome (回文)。
思路:使用正则去掉不相关符号后,将字符串分割字符串spilt() 方法)为数组,再将得到的数组翻转数组reverse() 方法)后组合为新字符串,最后判断新、旧字符串是否相等。

function palindrome(str) {
 // 先后去除空格和非数字字母的字符
  var newStr = str.replace(/\s/g,"").replace(/[^a-zA-Z0-9]/g,"").toLowerCase();
  //判断翻转后的字符串是否与原字符串相等
  var reverStr = newStr.split("").reverse().join("");
   if(reverStr === newStr){
      return true;
   }else{
     return false;
  } 
}


句中单词首字母大写其余小写

确保字符串的每个单词首字母都大写,其余部分小写。像 'the' 和 'of' 这样的连接符同理。

思路:

  1. 使用字符串分割将长句分为字符串数组1,接着使用双重循环第一重循环将数组1的每一项字符串分割为数组2,第二重循环是将数组2的首项大写,其余项小写。最后使用数组方法拼接为长句字符串。
function titleCase(str) {

  var arr1=str.split(" ");//拆分字符串为数组
  var arr2; 
  var newstr;

  for(var i=0; i < arr1.length;i++){

   arr2=arr1[i].split("");  
   arr2[0] = arr2[0].toUpperCase(); 

   for(var j=1;j < arr2.length;j++){

       arr2[j] = arr2[j].toLowerCase();

        }
    arr1[i] = arr2.join(""); 
  }
  newstr = arr1.join(" ");
  return newstr;
}
  1. 将长句字符串全部转化为小写,再将其首字母转为大写。
function titleCase(str) {
  // 请把你的代码写在这里
  var newStr=str.toLowerCase().split(" ").map(function(item){
    return item[0].toUpperCase()+item.slice(1);
  }).join(" ");
  return newStr;
}


将数组按照制定长度进行分组

把一个数组 arr 按照指定的数组大小 size 分割成若干个数组块。

例如: chunk([1,2,3,4],2)=[[1,2],[3,4]] ;
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]] ;

思路:声明一个空数组,然后将分割后的数组追加到该数组上。分割数组用 Array.slice() 方法。

function chunk(arr, size) {
  var newArr=[];
  for(var i=0;i<arr.length;i=i+size){ // 每次循环增加分割数组的长度个
    newArr.push(arr.slice(i,i+size)); 
  }
  return newArr;
}


比较字符串

如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

举例,["hello", "Hello"] 应该返回 true ,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。

function mutation(arr) {
  for(var j=0;j<arr[1].length;j++){
    if(arr[0].toLowerCase().indexOf(arr[1].toLowerCase()[j])===-1){
      return false;
    }
  }
  return true;
}

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。(此方法对大小写敏感)



过滤数组假值

删除数组中的所有假值。
在JavaScript中,假值有 falsenull0""undefinedNaN

function bouncer(arr) {
  var newArr=arr.filter(function(item){
    return Boolean(item);
  });
  return newArr;
}

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。filter() 不会对空数组进行检测。filter() 不会改变原始数组。



去掉数组中指定项

第一个参数是待摧毁的数组,其余的参数是待摧毁的值。

思路:将数组中的数字和后面的参数进行一一匹配,不相等则返回,相等则不返回。

方法:算法类似过滤因此可以使用 filter 函数,将数组中的数字过滤。

使用 arguments 来进行参数的遍历

function destroyer(arr) {
  var arr_arg = arguments;
  for(var i = 1; i < arr_arg.length; i++){
     arr = arr.filter(function(val){
       return arr_arg[i] !== val;
     });
  }
  return arr;
}

用for循环将数组中的数字与参数进行匹配,除了第一个参数(为数组)。另一种简单方法



数组排序并找出元素索引

先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。
举例:where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4],而1.5对应的索引值就是1。

function where(arr, num) {
  arr.push(num);
  arr.sort(function(a,b){
    return a-b;
  });
  return arr.indexOf(num);
}


凯撒密码

下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。

function rot13(str) { 
  var arr=[];
  var num;
  for(var i=0;i<str.length;i++){
    num=str[i].charCodeAt();
    if(num >= 65 && num <= 77){
      num=num+13;
    }else if(num > 77 && num < 91){
      num=num-13;
    }
    arr.push(String.fromCharCode(num));
  }
  return arr.join("");
}
上一篇 下一篇

猜你喜欢

热点阅读