美文网首页大闹前端Web前端之路程序员
freeCodeCamp 初级javascript算法体验

freeCodeCamp 初级javascript算法体验

作者: Iris_mao | 来源:发表于2017-08-02 16:28 被阅读72次
    1、翻转字符串(Reverse a String)

    翻转字符串
    先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
    你的结果必须得是一个字符串
    对你有帮助的资源:
    Global String Object String对象的了解
    String.split() 将一个String对象分割成字符串数组
    Array.reverse() 将数组中元素的位置颠倒。第一个数组元素成为最后一个数组元素,最后一个数组元素成为第一个。
    Array.join() 将数组(或一个类数组对象的所有元素连接到一个字符串中。

    //思路:注意有的方法是针对字符串有的是针对数组,所以字符串和数组之间的转换很重要!   
    //hello--split-->["h", "e", "l", "l", "o"]--reverse-->["o", "l", "l", "e", "h"]--join-->olleh
    function reverseString(str) {
      str = str.split("").reverse().join("");
      return str;
    }
    reverseString("hello");
    
    2、计算一个整数的阶乘(Factorialize a Number)

    计算一个整数的阶乘
    如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。
    阶乘通常简写成n!
    例如:5! = 1 * 2 * 3 * 4 * 5 = 120
    对你有帮助的资源:
    Arithmetic Operators 算术运算符以数值(字面量或变量)作为其操作数,并返回一个单个数值。标准算术运算符是加法(+),减法( - ),乘法(*)和除法(/)。

    //思路1:将要计算的数值从1开始递加,是有数值相乘即可
    function factorialize(num) {
      var result = 1;
      for(var i = 1;i<=num;i++){
        result = result * i;
      }
      return result;
    }
    factorialize(5);
    //思路2:也可以用递归的思想,每次乘以比自己小1的数字
    function factorialize(num) {
      // 请把你的代码写在这里
      if(num>0){
        return (num * factorialize(num-1));
      }else
        return 1;
    }
    factorialize(5);
    
    3、检查回文字符串(Check for Palindromes)

    检查回文字符串
    如果给定的字符串是回文,返回true,反之,返回false。
    如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
    注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
    函数参数的值可以为"racecar","RaceCar"和"race CAR"。
    对你有帮助的资源:
    String.replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。
    String.toLowerCase() 会将调用该方法的字符串值转为小写形式,并返回。

    //思路:先去掉字符串多余的标点符号和空格,然后把字符串转化成小写,如果字符串和翻转之后的字符串相等,则是回文
    function palindrome(str) {
       str = str.toLowerCase().replace(/[\W\s_]/g, '');  //正则表达式:\w查找单词字符,\W查找非单词字符,\s查找空白字符,\S查找非空白字符
      return str === str.split("").reverse().join("");
    }
    palindrome("eye");
    
    4、找出最长单词(Find the Longest Word in a String)

    找出最长单词
    在句子中找出最长的单词,并返回它的长度。
    函数的返回值应该是一个数字。
    对你有帮助的资源:
    String.length 获取一个字符串的长度

    //思路:先将句子分割成一个一个的字符串存在数组里,循环比较每个字符串的大小,将最大值赋值gwinnett临时变量length
    function findLongestWord(str) {
      var result = str.split(" ");
      var length = result[0].length;  //临时变量,存放其中一个字符串的长度
      for(var i = 0 ;i<result.length;i++){
        if(result[i].length>length){
          length = result[i].length;
        }
      }
      return length;
    }
    findLongestWord("The quick brown fox jumped over the lazy dog");
    
    5、句中单词首字母大写(Title Case a Sentence)

    句中单词首字母大写
    确保字符串的每个单词首字母都大写,其余部分小写。
    对你有帮助的资源:
    String.slice() 提取一个字符串的一部分并返回一个新字符串

    //思路:将所有的字符串小写之后分割成单独的字符串存放在数组里,循环数组将每一个字符串的首字母分割出来并大写和其余的字符串合并起来形成新的字符串,最后将数组中的所有字符串连接成一个新的字符串
    function titleCase(str) {
      var result = str.toLowerCase().split(" ");
      for(var i =0;i<result.length;i++){
        result[i] = result[i].slice(0,1).toUpperCase()+result[i].slice(1);
      }
      return result.join(' ');
    }
    titleCase("I'm a little tea pot");
    
    6、找出多个数组中的最大数(Return Largest Numbers in Arrays)

    找出多个数组中的最大数
    右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
    提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。

    //思路:通过二次循环,比较出每一组数组的最大值,存放到新的数组中
    function largestOfFour(arr) {
      var newArr= [];  //存放新数组
      var temp;  //存放临时最大值
      for(var i = 0;i<arr.length;i++){
        temp=arr[i][0];
        for(var j = 0;j<arr[i].length;j++){
          if(arr[i][j]>temp){
            temp = arr[i][j];
          }
          newArr[i]=temp;
        }
      }
      return newArr;
    }
    largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
    
    7、检查字符串结尾(Confirm the Ending)

    检查字符串结尾
    判断一个字符串(str)是否以指定的字符串(target)结尾。
    如果是,返回true;如果不是,返回false。
    对你有帮助的资源:
    String.substr() 方法返回一个字符串中从指定位置开始到指定字符数的字符。

    //思路:从target前面的字符位置(字符长度-target长度)开始截取,看截取出来的字符跟target一不一样
    function confirmEnding(str, target) {
      return str.substr(str.length-target.length) == target;
    }
    confirmEnding("Bastian", "n");
    
    8、重复输出字符串(Repeat a string repeat a string)

    重复输出字符串
    重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。

    //思路:循环要输出的次数,将字符串连接起来即可
    function repeat(str, num) {
      var temp = "";
      for(var i = 0 ; i < num ; i ++){
        temp+=str;
      }
      return temp;
    }
    repeat("abc", 3);
    
    9、截断字符串(Truncate a string)

    截断字符
    如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。
    切记,插入到字符串尾部的三个点号也会计入字符串的长度。
    但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

    //思路:分成小于等于3和大于3的两种情况,然后用slice切断字符最后加上‘...’
    function truncate(str, num) {
      if(num <= 3){
        str = str.slice(0,num)+'...';
      }else if(str.length > num){
        str = str.slice(0,num-3)+'...';
      }
      return str;
    }
    truncate("A-tisket a-tasket A green and yellow basket", 11);
    
    10、猴子吃香蕉, 分割数组(Chunky Monkey)

    猴子吃香蕉, 分割数组
    (猴子吃香蕉可是掰成好几段来吃哦)
    把一个数组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.push() 方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

    //思路:先按照size确定分成几组,如果有多余的组数+1,然后确定分割的开始和结束位置,将分割出来的数组存放到新的数组中
    function chunk(arr, size) {
      var len = parseInt(arr.length/size);  //分组
      var remain = arr.length%size;   //取模,看是否有多余的数组
      var a = [];  //存放最后的数组
      var sot = remain > 0?len+1:len;
      for(var i = 1;i<=sot;i++){
        var start = size * (i - 1);    //确定开始和结束位置
        var end = (i>len)?(i-1)*size+remain:i*size;
        var mylocates = arr.slice(start,end);   // 分割数组
        a.push(mylocates);   //存放到新的数组中
      }
      return a;
    }
    chunk(["a", "b", "c", "d"], 2);
    
    11、截断数组(Slasher Flick)

    截断数组
    返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
    对你有帮助的资源:
    Array.splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。

    //思路:用splice函数,从0开始截断howmany个长度,返回截断之后的字符串
    function slasher(arr, howMany) {
      arr.splice(0,howMany);
      return arr;
    }
    slasher([1, 2, 3], 2);
    
    12、比较字符串(Mutations)

    比较字符串
    如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
    举例,["hello", "Hello"]
    应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
    ["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。
    ["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。
    对你有帮助的资源:
    String.indexOf() 方法返回调用String对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索。如果未找到该值,则返回-1。
    String.charAt() 方法从一个字符串中返回指定的字符。

    //思路:在第一个字符串里面循环查找第二个字符串中的每一个字符,有一个就没有false
    function mutation(arr) {
      for(var i =0;i<arr[1].length;i++){
        if(arr[0].toUpperCase().indexOf(arr[1].charAt(i).toUpperCase())==-1)  return false;   
      }
      return true;
    }
    mutation(["hello", "hey"]);
    

    13、过滤数组假值(Falsy Bouncer)

    过滤数组假值
    删除数组中的所有假值。
    在JavaScript中,假值有false、null、0、""、undefined和NaN。
    对你有帮助的资源:
    Boolean Objects 对象是一个布尔值的对象包装器。
    Array.filter() 为数组中的每个元素调用一次 callback函数,并利用所有使得 callback返回 true 或等价于 true 的值的元素创建一个新数组。

    //思路:新建一个callback函数,检测元素是否是假元素,不是假元素则返回元素,用callback函数过滤需要检查的数组,返回过滤剩下的元素
    function bouncer(arr) {
      function isBigEnough(element){
        if(element!==false || element!==null || element!==0 || element!=="" || element!==undefined || element!==NaN){
          return element;
        }
      }
      var filtered = arr.filter(isBigEnough);    //过滤函数
      return filtered;
    }
    bouncer([7, "ate", "", false, 9]);
    
    14、摧毁数组(Seek and Destroy)

    摧毁数组
    金克斯的迫击炮!
    实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
    对你有帮助的资源:
    Arguments object 是一个类似数组的对象, 对应于传递给函数的参数。是隐藏的参数。

    //思路:将要删除的元素存放到一个数组中,用filter函数过滤掉要删除的元素(用indexOf方法)
    function destroyer(arr) {
      var args = [];  //存放要删除的元素
      for(var i =1;i<arguments.length;i++){
        args.push(arguments[i]);  //将隐藏的参数(待删除的值)存放到一个数组中,除去第一个数组值,所以从1开始存放
      }
      var temp = arr.filter(function(item,index,array){
        return args.indexOf(item) < 0;
      });  //用filter函数,返回数组中未找到item的值,即不用删除的值
      return temp;
    }
    destroyer([1, 2, 3, 1, 2, 3], 2, 3);
    
    15、数组排序并找出元素索引(Where do I belong)

    数组排序并找出元素索引
    举例:where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4],而1.5对应的索引值就是1。
    同理,where([20,3,5], 19) 应该返回 2。因为数组会先排序为 [3,5,20],19插入到数组[3,5,20]后变成[3,5,19,20],而19对应的索引值就是2。

    //思路:将num值跟数组中的值循环进行对比,r记录num是第几位排序
    function where(arr, num) {
      var len = arr.length;
      var r = 0;
      for(var i =0;i<len;i++){
        if(num > arr[i]){
          r++;
        }
      }
      return r;
    }
    where([40, 60], 50);
    
    16、凯撒密码(Caesars Cipher)

    凯撒密码
    下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。
    移位密码也就是密码中的字母会按照指定的数量来做移位。
    一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。
    写一个ROT13函数,实现输入加密字符串,输出解密字符串。
    所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
    对你有帮助的资源:
    String.charCodeAt() 方法返回0到65535之间的整数,表示给定索引处的UTF-16代码单元 (在 Unicode 编码单元表示一个单一的 UTF-16 编码单元的情况下,UTF-16 编码单元匹配 Unicode 编码单元。但在——例如 Unicode 编码单元 > 0x10000 的这种——不能被一个 UTF-16 编码单元单独表示的情况下,只能匹配 Unicode 代理对的第一个编码单元) 。如果你想要整个代码点的值,使用 codePointAt()。
    String.fromCharCode() 方法返回使用指定的Unicode值序列创建的字符串。

    //思路:unicode编码范围:大写字母[65,90],小写字母[97,122]
    function rot13(str) { 
      var str1 = [];
      for(var i =0;i<str.length;i++){
        var num = str[i].charCodeAt();    //返回字母的编码
        if(num>=65&&num<=77)  //前13个大写字母
          num = num+13;
        else if(num>77&&num<91)  //后13个大写字母
          num = num - 13;
        str1.push(String.fromCharCode(num));  //接收指定的unicode值,返回一个字符串
      }
      return str1.join("");
    }
    rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK."); 
    
    写在最后的注意点:
    • indexOf的‘o‘一定要大写,我已经掉坑两次,检查了好久不知道错在哪里
    • slice()方法 和splice 方法的区别。。。
    • 区别有些方式是string方法,有些是array方法,所以要会string和array之间的灵活转换
    • 熟练运行各种截取string字符串的方法

    相关文章

      网友评论

        本文标题:freeCodeCamp 初级javascript算法体验

        本文链接:https://www.haomeiwen.com/subject/dsyzqxtx.html