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 年 09 月 19 日 12 : 25 AM
如果觉得我的文章对你有用,请随意赞赏

发表评论