RX学习笔记:FreeCodeCamp的JavaScript基本算法挑战

FreeCodeCamp的JavaScript基本算法挑战

https://www.freecodecamp.com

2016-07-03

JavaScript还不是非常熟悉,用已经会的知识来解这些题,估计有些算法会非常笨。

1.反转字符串

str.split("").reverse().join("");

2.阶乘(阶乘0的结果需为1)

function factorialize(num) {
  var n=1;
  for(var i=num;i>0;i--){
    n*=i;}
  return n;
}

暂时想不到能不用添加临时变量的方法。

3.判断回文字符串

所谓回文,就是字符串反转后和反转前是一样的,而且忽略除字母数字外的其它字符并且忽略大小写。

因为不懂正则表达式,所以花费了很多时间,看来要好好看一下正则才行。

str.match(/[a-zA-Z0-9]/gi).join("").toLowerCase()==str.match(/[a-zA-Z0-9]/gi).reverse().join("").toLowerCase();

4.查找字符串中最长的单词

str.split(" ").sort(function(a,b){return b.length-a.length;})[0];

5.让字符串中每个单词的首字母大写,其他字母小写

str.split(" ").map(function(arg){return arg.charAt(0).toUpperCase()+arg.substr(1).toLowerCase();}).join(" ");

6.让一个二维整数数组的每个子数组只保留最大的数字

 for (var i=0;i<arr.length;i++){
   arr[i]=arr[i].sort(function(a,b){return b-a;}).shift();
 }

7.判断字符串尾部是否和目标字符串相同

str.substr(-target.length)==target;

8.按给定次数生成重复字符串

function repeatStringNumTimes(str, num) {
  var Str="";
  while (num>0){
    Str+=str;
    num--;
  }
  return Str;
}

又一题需要临时变量,后面再回来看看能如何优化。

9.缩略字符串(从字符串开始截取子字符串并加上“...”3个点号生成新字符串,新字符串长度等于指定长度)

function truncateString(str, num) {
  if(str.length>num){
    if(num>3){
    str=str.slice(0,num-3)+"...";
    }else{
    str=str.slice(0,num)+"...";
    }
  }
  return str;
}

做到这一题感觉自己的编码和算法都开始真的变糟糕了……

10.矮猴(什么鬼来的,好难)将一维数组按指定长度分割成二维数组

function chunkArrayInGroups(arr, size) {
  var myarr=[];
     for (var i=0;i<arr.length/size;i++){
         myarr[i]=arr.slice(i*size,i*size+size);
     }
  return myarr;
}

感觉我这方法尽瞎扯,虽然能达到效果,但总觉得怪怪,应该轻松地使用arr返回,我却只能使用临时变量myarr返回。

11.惊悚电影(又来一个什么鬼名字)从数组指定位置截取新数组,看起来好像很难的样子。

function slasher(arr, howMany) {
  arr=arr.slice(howMany);
  return arr;
}

然后我试着用这么一句,然后就通过了……通过了、通过了?什么情况,不应该这么容易吧?对着起这么吓人的题目名字吗!

12.突变,一维数组有二个字符串元素,判断第一个元素是否包含第二个元素的所有字符,忽略大小写。

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

13.删除数组中所有Flasy(假)值

arr.filter(function(val){if(val){return val;}});

14.搜查销毁

函数仅有一个参数为整数数组,有个数不固定整数参数需使用隐藏参数访问。过滤数组参数中出现的整数参数相同的数值,返回过滤后的数组。

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

  return arr;
}

从这一题开始暴力拆解。

15.判断一个整数在一个乱序整数数组中按从小到大的顺序排列应在哪个索引位置插入

function getIndexToIns(arr, num) {
  arr=arr.sort(function(a,b){return a-b;});
  for(var i=0;i<arr.length;i++){
    if(num>arr[i]&&num<arr[i+1]){
      return i+1;
    }  else if(num==arr[i]){
      return i;
    }  else if(i==arr.length-1){
    return i+1;
    }
  }
  return num;
}

完全暴力解题,无语了。

16.凯撒密码 ROT13(没听说过?)

ROT13就是将26个字母分成两段,每段13个,然后对应位置进行调换的简单加密方法。换算成字符编码就是直接加或减13再转换回字符。

function rot13(str) {
  function rot13char(char){
    if (char.charCodeAt()>=65&&char.charCodeAt()<=90){
      return char.charCodeAt()>=78?String.fromCharCode(char.charCodeAt()-13):String.fromCharCode(char.charCodeAt()+13);
    }else
      return char;
  }
  str=str.split("").map(rot13char).join("");
  return str;
}

增加一个过滤子函数单独处理字符,感觉相当啰嗦,应该有一行就能解决的方法吧?

终于熬完最后一题了,总共用了快要一天的时间。

posted @ 2016-07-04 02:39  陈喜  阅读(321)  评论(0)    收藏  举报