FCC学习记录——算法挑战篇

看了一下他要挑战的js算法还是蛮多的,单独开一个文章来写吧,之前那个学习记录已经太臃肿了(╯°A°)╯︵○○○

1.翻转字符串

  • 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
  • 你的结果必须得是一个字符串

    function reverseString(str) {
      // 请把你的代码写在这里
      str = str.split('');
      str = str.reverse();
      str = str.join('');
      return str;
    }
    
    reverseString("hello");
    

2.计算一个整数的阶乘

  • 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。
  • 阶乘通常简写成 n!
  • 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120

    function factorialize(num) {
      // 请把你的代码写在这里
      var arr = [];
      for (var i = 0; i < num; num--) {
        arr.push(num);
      }
      var total = 1;
      for (var j = 0; j < arr.length; j++) {
        total *= arr[j];
      }
      num = total;
      return num;
    }
    
    factorialize(5);
    

看到题目我首先想到的是之前学过的数组各项相加,然后我就想着把传的值拆开放进数组再相乘,然后就写出了上面这段冗长的代码,之后我百度看了一下别人的写法

function factorialize(num) {
  return num > 1 ? num * factorialize(num-1) : 1;
}

我:???WTF!!一段代码就搞定了,这段代码运用了数学上的递归思想(数学不及格的我留下了悔恨的泪水(/ω\))

3.检查回文字符串

  • 检查回文字符串,如果给定的字符串是回文,返回true,反之,返回false。
  • 如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
  • 注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。

    function palindrome(str) {
     // 请把你的代码写在这里
     var regex = /[^a-zA-Z0-9]/g;               //这里正则表达式意思是匹配所有非字母和数字的项
     var str1 = str.replace(regex, '');         //利用replace匹配str所有非字母数字的项替换成无并赋值给str1
     var str2 = str1.toLowerCase();             //把str1的值转换为小写并赋值给str2
     var oldStr = str2;                         //格式化后的str2赋值给oldStr, 存值
     str2 = str2.split('');                     //str2拆分为数组
     str2 = str2.reverse();                     //str2数组翻转
     str2 = str2.join('');                      //str2翻转后的数组重新组合为字符串
     if(str2 == oldStr) {                       //对比之前存的值和翻转后的值,相同返回true,反之返回false
       return true;
     } else {
       return false;
     }
    }
    
    palindrome("race car");
    

同样完成后百度了一下别人的代码

function palindrome(str) {
  str = str.toLowerCase().replace(/[\W\s_]/g, '');
  return str === str.split("").reverse().join("");
}

别人家的代码啊。。OωO,不过好在思路是一样的,只是说简化了许多,少了很多赋值的过程直接一步到位了

4.找出最长单词

  • 在句子中找出最长的单词,并返回它的长度。
  • 函数的返回值应该是一个数字。

    function findLongestWord(str) {
     // 请把你的代码写在这里
     var arr = str.split(' ');                    //把str拆分成数组并存值到arr里
     var newArr = [];
     for (var i = 0; i < arr.length; i++) {
       newArr.push(arr[i].length);                //遍历数组arr获取每个元素的长度并push到newArr里
     }
     newArr.sort(function(a, b) {
       return b - a;                              //利用sort把newArr里的数字从大到小排序
     });
     
     return newArr[0];
    }
    
    findLongestWord("The quick brown fox jumped over the lazy dog");
    

完成后看了别人的代码,思路还是那个思路,就是别人的代码总是比我的短。。就不贴来打击自己脆弱的心灵了

5.句中单词首字母大写

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

    function titleCase(str) {
    
     var array = str.toLowerCase().split(" ");
     for (var i = 0; i < array.length; i++) {
       array[i] = array[i][0].toUpperCase() + array[i].substring(1, array[i].length);
     }
     var string = array.join(" ");
    
     return string;
    }
    
    titleCase("I'm a little tea pot");
    

嗯…这里不会做,百度了别人的代码,都怪那个substring()的方法没有学过,嗯就是这样。

6.找出多个数组中的最大数

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

    function largestOfFour(arr) {
       // 请把你的代码写在这里
       var newArr = [];
       for (i = 0; i < arr.length; i++) {
           arr[i].sort(function (a, b) {
               return b - a;
           });
           newArr.push(arr[i][0]);
       }
       return newArr;
    }
    
    largestOfFour([
       [4, 5, 1, 3],
       [13, 27, 18, 26],
       [32, 35, 37, 39],
       [1000, 1001, 857, 1]
    ]);
    

7.检查字符串结尾

  • 判断一个字符串(str)是否以指定的字符串(target)结尾。
  • 如果是,返回true;如果不是,返回false。

    function confirmEnding(str, target) {
     // 请把你的代码写在这里
     if (str.substr(target.length-target.length-target.length) == target) {
       return true;
     } else return false;
    }
    
    confirmEnding("Bastian", "n");
    

8.重复输出字符串(重要的事情说3遍)

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

    function repeat(str, num) {
     // 请把你的代码写在这里
     var str2 = '';
     if (num > 0) {
       for (var i = 0; i < num; i++) {
         str2 += str;
       }
       return str2;
     } else return '';
    }
    
    repeat("abc", 3);
    

9.截断字符串(用瑞兹来截断对面的退路)

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

    function truncate(str, num) {
     // 请把你的代码写在这里
     if (num < 4) {
       str = str.slice(0, num) + "...";
     } else if (str.length < num) {
       return str;
     } 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.猴子吃香蕉, 分割数组(猴子吃香蕉可是掰成好几段来吃哦)

  • 把一个数组arr按照指定的数组大小size分割成若干个数组块。
  • 例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
  • chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];

    function chunk(arr, size) {
     // 请把你的代码写在这里
     var newArr = [];
     for(var i = 0; i < arr.length; i += size) {
       newArr.push(arr.slice(i, i + size));
     }
     return newArr;
    }
    
    chunk(["a", "b", "c", "d"], 2);
    

11.截断数组

  • 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。

    function slasher(arr, howMany) {
     // 请把你的代码写在这里
     arr.splice(0, howMany);
     return arr;
    }
    
    slasher([1, 2, 3], 2);
    

12.比较字符串(蛤蟆可以吃队友,也可以吃对手)

  • 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
  • 举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
  • ["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。
  • ["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。

    function mutation(arr) {
     // 请把你的代码写在这里
     for (var i = 0; i < arr[1].length; i++) {
       if (arr[0].toLowerCase().indexOf(arr[1][i].toLowerCase()) < 0) {
         return false; 
       }
     }
     return true;
    }
    
    mutation(["hello", "hey"]);
    

13.过滤数组假值(真假美猴王)

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

    function bouncer(arr) {
     // 请把你的代码写在这里
     return arr.filter(Boolean);
    }
    
    bouncer([7, "ate", "", false, 9]);
最后修改:2019 年 06 月 11 日 06 : 38 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论