美文网首页
Freecodecamp 算法题

Freecodecamp 算法题

作者: hzl的学习小记 | 来源:发表于2019-07-19 10:13 被阅读0次

    Freecodecamp 算法题

    1. Reverse a String

    翻转字符串

    先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。

    你的结果必须得是一个字符串

    当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。

    这是一些有帮助的资源:

    思路:先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。

    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

    • 方法一:
    function factorialize(num) {
    if (num <= 1) {
       return 1;
    }else {
       return factorialize(num - 1) * num;
    }
      return num;
    }
    
    factorialize(10);
    
    • 方法二
    function factorialize(num) {
    if(num<=1){return 1;}
      var number=1;
      let n;
      for(n =1; n<num;n++){
         number *= n+1
      }
      return number;
    }
    factorialize(5);
    

    3. Check for Palindromes

    检查回文字符串

    如果给定的字符串是回文,返回true,反之,返回false。

    如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

    注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。

    函数参数的值可以为"racecar","RaceCar"和"race CAR"。

    function palindrome(str) {
      var regex = /[^a-zA-Z0-9]/g;
      var tmpStr = str.replace(regex,'').toLowerCase().split('');
      if(tmpStr.join('')===tmpStr.reverse().join('')){
        return true;
      }else{
        return false;
      }
    }
    palindrome("eye");
    

    4. Find the Longest Word in a String

    找出最长单词

    在句子中找出最长的单词,并返回它的长度。

    函数的返回值应该是一个数字。
    思路:: 利用数组sort()方法,sort()方法需要接受一个比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

    1. 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
    2. 若 a 等于 b,则返回 0。
    3. 若 a 大于 b,则返回一个大于 0 的值。
    function findLongestWord(str) {
      var result = str.split(' ');
      result.sort(function(firstElement, secondElement){
        return secondElement.length-firstElement.length;
      });
      return result[0].length;
    }
    
    findLongestWord("The quick brown fox jumped over the lazy dog");
    

    5. Title Case a Sentence

    句中单词首字母大写

    确保字符串的每个单词首字母都大写,其余部分小写。

    像'the'和'of'这样的连接符同理。
    思路:使用split分离str,使用slice()是首字母大写

    再就是toLowerCase()和toUpperCase()的用法,要搞清前两者和toLocaleLowerCase()、toLocaleUpperCase()的区别

    function titleCase(str) {
      var result = str.split(' ')
      var newArray = [];
      for(let i=0;i<result.length;i++){
        var newStr=result[i].slice(0,1).toUpperCase() + result[i].slice(1).toLowerCase();
        newArray.push(newStr);
      }
      
      
      return newArray.join(' ');
    }
    titleCase("I'm a little tea pot");
    

    6. Return Largest Numbers in Arrays

    找出多个数组中的最大数

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

    function largestOfFour(arr) {
      var newArr=[];
     
      for(var i=0;i<arr.length;i++){
        let max=0;
        for(var j=0;j<arr[i].length;j++){
          if(arr[i][j] > max)  max=arr[i][j];
        }
        newArr.push(max);
      }
      return newArr;
    }
    largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])
    

    7. Confirm the Ending

    检查字符串结尾

    判断一个字符串(str)是否以指定的字符串(target)结尾。

    如果是,返回true;如果不是,返回false。

    function confirmEnding(str, target) {
      var result;
      str.substr(str.length-target.length,str.length)===target ? result= true : result = false;
      return result;
    }
    
    confirmEnding("Bastian", "n");
    

    8. Repeat a string repeat a string

    重复输出字符串

    重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。
    思路:用concat在字符串后面重复字符串

    function repeat(str, num) {
      var result="";
      if(num<=0) return "";
      else {
        for(let i=0;i<num;i++){
          result=result.concat(str);
        }
      }
      return result;
    }
    
    repeat("abc", 3);
    

    9. Truncate a string

    截断字符串
    如果字符串的长度比指定的参数num长,
    则把多余的部分用...来表示。

    切记,插入到字符串尾部的三个点号也会计入字符串的长度。

    但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

    function truncate(str, num) {
      var string='';
      if(num<str.length){
        if(num<=3){
          string = str.slice(0,num)+'...';
          return string;
        }else{
          string = str.slice(0,num-3)+'...';
          return string;
        }
      }
      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]];

    function chunk(arr, size) {
      var newArr=[];
      for(let i=0;i<arr.length;i+=size){
        newArr.push(arr.slice(i,i+size))
      }
      return newArr;
    }
    
    chunk(["a", "b", "c", "d"], 3);
    

    11. Slasher Flick

    截断数组

    返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
    方法一:(slice)

    function slasher(arr, howMany) {
      return arr.slice(howMany,arr.length);
    }
    
    slasher([1, 2, 3], 2);
    

    方法二:(splice)

    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"找到。

    function mutation(arr) {
      var FirstVal=arr[0].toLowerCase();
      var SecondVal = arr[1].toLowerCase();
      for(var i in SecondVal){
        if(FirstVal.indexOf(SecondVal[i])==-1){
          return false;
        }
      }
     return true;
    }
    
    mutation(["hello", "hey"]);
    

    13. Falsy Bouncer

    过滤数组假值

    (真假美猴王)

    删除数组中的所有假值。

    在JavaScript中,假值有false、null、0、""、undefined 和 NaN。

    function bouncer(arr) {
       var newArr = arr.filter(function(e){
         if(e){
           return e;
         }
        
       });
       return newArr;
    }
    bouncer([7, "ate", "", false, 9]);
    

    14. Seek and Destroy

    摧毁数组
    实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
    思路:

    摧毁函数destroyer(arr,argument1,argument2,argument3,...)
    函数参数不确定,第一个参数为一个数组,其他参数为要摧毁的数。即目标输出的数组应该是第一个参数数组删除其他参数后的数组。

    将从第二个参数开始的参数组成一个数组。然后用fitter()来将数组内的每个数和新的数组进行比对,返回不符合的。

    function destroyer(arr) {
      
      var arr_arg = arguments;
      var newArr=[];
      
      for(var i=1;i<arr_arg.length;i++){
        newArr.push(arr_arg[i]);
      }
      arr = arr.filter(function(val){
       return newArr.indexOf(val) == -1;
      });
       return arr;
    }
    
    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。

    function where(arr, num) {
       arr.push(num);
       arr.sort(function(a,b){
         return a-b;
       });
       var result = arr.indexOf(num);
       return result;
    }
    
    where([40, 60], 50);
    

    16. Caesars Cipher

    凯撒密码

    (让上帝的归上帝,凯撒的归凯撒)

    下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。

    移位密码也就是密码中的字母会按照指定的数量来做移位。

    一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。

    写一个ROT13函数,实现输入加密字符串,输出解密字符串。

    所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。

    ASCII字符

    在JavaScript中可以通过String.prototype.charCodeAt()方法返回0至65535这间的整数,代表索引处理字符的UTF-16编码单元。可以通过这个方法查出每个字符对应的ASCII编码:

    'a'.charCodeAt();    //97
    'A'.charCodeAt();    //65
    'abc'.charCodeAt(0); //97
    'ABC'.charCodeAt(0); //65
    

    如此一来,A-Z对应的就是65-90。而ROT13是将大写字符串将向后移13位,然后转换成对应的字符。那么:

    • 小于65和大于90对应的就是小写字符a-z
    • 大于等于65和小于等于77对应的就是大写字符A-M
    • 大于等于78和小于等于90对应的就是大写字符N-Z
    function rot13(str) { 
      var newStr='';
      for(var i in str){
        var temp= str.charCodeAt(i);
        if(temp<65 || temp>91){
          newStr+=str[i];
          continue;
        }
        
        if(temp>77){
          newStr+=String.fromCharCode(temp-13);
        }else{
           newStr+=String.fromCharCode(temp+13);
        }
      }
      
      return newStr;
    }
    
    rot13("SERR CVMMN!")
    

    相关文章

      网友评论

          本文标题:Freecodecamp 算法题

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