FCC_Intermediate Algorithm Scripting

1.字符串翻转

具体代码:

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

reverseString("hello");

涉及知识点:

String.split()中,将一个字符串每一个字符进行切割,写法是: String.split('')

Array.join(),将数组按照传入的字符进行连接成为一个字符串

2.求阶乘

具体代码:

function factorialize(num) {
  // 请把你的代码写在这里
  if(num === 0){
    return 1;
  }else{
    return factorialize(num - 1)*num;
  }
  return num;
}

factorialize(5);
涉及知识点: 未涉及到过多的js语法,只是需要采用递归,找到递归边界即可,当然也可以采用将所有数放到一个数组里进行循环

3.求回文数

问题描述:检查回文字符串

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

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

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

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

具体代码:

function palindrome(str) {
  // 请把你的代码写在这里
  str = str.replace(/[\s|\~|`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g, '');
  str = str.toLowerCase();
  if(str == str.split('').reverse().join(''))
    return true;
  else
    return false;
 
}
palindrome("eye");

涉及知识点:

string.replace()方法 和java略有区别,在js中可以直接在第一个参数写上正则表达式,而java中需要加"",第二个参数都是替换的字符.

正则表达式中的几个小点:

  •  最左边的/代表正则表达式的头部
  • []表示定义匹配的字符范围,其中在正则表达式中三种括号的区别见这篇文章:正则表达式(括号)、[中括号]、{大括号}的区别小结
  • \s 表示匹配所有空格 换行 制表符在内的所有空白,其余都是标点的转义字符
  • /g表示全局,代表是替换所有而不是第一个

4.求最长单词长度

问题描述:在句子中找出最长的单词,并返回它的长度。

具体代码:

function findLongestWord(str) {
  // 请把你的代码写在这里
  var result = 0;
  var strArr = str.split(' ');
  strArr.map(function(val){
    if(val.length > result) result = val.length;
  });
  return result;
}

findLongestWord("The quick brown fox jumped over the lazy dog");

涉及知识点:

  • arr.map可以遍历数组中所有值

5.单词首字母大写转换

句中单词首字母大写

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

具体代码:

function titleCase(str) {
  // 请把你的代码写在这里
  var arr = str.split(' ');
  var resultArr = arr.map(function(val){
    var wordArr = val.toLowerCase().split('');
    wordArr[0] = wordArr[0].toUpperCase();
    return wordArr.join('');
  });
  return resultArr.join(' ');
}

titleCase("I'm a little tea pot");

涉及知识点:

  • 处理逻辑为:先所有都小写 然后首字母大写
  • 注意arr.map类似于java8中的stream流中的map,如果内部函数返回一个值,将所有返回的值作为新数组的元素

6.找到多个数组中的最大值

问题描述:

找出多个数组中的最大数

右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。

具体代码:

function largestOfFour(arr) {
  // 请把你的代码写在这里
  var result = [];
  for(var i=0; i<arr.length; i++){
    var sortArr = arr[i].sort(function(a, b){
      return a < b;
    });
    result.push(sortArr[0]);
  }
  return result;
}

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) {
  // 请把你的代码写在这里
  str = str.substr(str.length-target.length, str.length);
  return str===target;
}

confirmEnding("Bastian", "n");

涉及知识点:

  • 字符串substr方法是用来截取字符串的 同样输入进去的两个index是左闭右开的
  • === 严格相等

8.重复输出字符串

具体代码:

function repeat(str, num) {
  // 请把你的代码写在这里
  //暂存str
  var tmp = str;
  //清空str
  str = '';
  if(num < 0){
    return "";
  }else{
    while(num > 0){
      str += tmp;
      num--;
    }
    return str;
  }  
  
}

repeat("abc", 3);

9.截断字符串

问题描述:

截断字符串(用瑞兹来截断对面的退路)如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。

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

具体代码:

function truncate(str, num) {
  // 请把你的代码写在这里
  if(str.length <= num){
    return str;
  }else{
    if(num <= 3){
      str = str.substr(0, num);
      str += '...'; 
    }else{
      str = str.substr(0, num-3);
      str += '...';
    }
    return str;
  }

}

truncate("A-tisket a-tasket A green and yellow basket", 11);

涉及知识点:

  • slice() 和 substr() 具有相同的作用 用法也相同

10.分割数组

问题描述:把一个数组arr按照指定的数组大小size分割成若干个数组块。

具体代码:

function chunk(arr, size) {
  // 请把你的代码写在这里
  var result = [];
  for(var i=0; i<arr.length; i+=size){
    var tmp = arr.slice(i, i+size);
    result.push(tmp);
  }
  return result;
}

chunk(["a", "b", "c", "d"], 2);

涉及知识点:

  • slice方法不仅可以分割字符串还可以分割数组

11.截断数组

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

具体代码:

function slasher(arr, howMany) {
  // 请把你的代码写在这里
  return arr.slice(howMany, arr.length);
}

slasher([1, 2, 3], 2);

涉及知识点:

  • splice()方法 可以直接对数组进行增删,第一个参数是开始位置,第二个参数如果是删则将中间参数其设为需要删的个数,如果不删则将中间参数其置为0,如果需要增则在后面带上需要增加的元素,可以有多个splice方法介绍

12.比较字符串

问题描述:如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。

["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。

["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。

具体代码:

function mutation(arr) {
  // 请把你的代码写在这里
  //忽略大小写
  var str1 = arr[0].toLocaleLowerCase();
  var str2 = arr[1].toLocaleLowerCase();
  
  var str2Arr = str2.split('');
  // 返回一个true 和 false 的数组
  var resultArr = str2Arr.map(function(val){
    if(str1.indexOf(val) == -1){
      return false;
    }
    return true;
  });
  
  for(var i=0; i<resultArr.length; i++){
    if(resultArr[i] === false){
      return false;
    }
  }
  return true;
  
}

mutation(["hello", "hey"]);

涉及知识点:

  • 字符串大小写的转换 字符串大小写转换博客
  • 对数组的操作map返回的也是一个数组,数组的内容是内部函数中return的东西

13.过滤数组的假值

问题描述:在JavaScript中,假值有falsenull0""undefinedNaN

具体代码:

function bouncer(arr) {
  // 请把你的代码写在这里
  return arr.filter(function(val){
    return Boolean(val).valueOf();
  });
}

bouncer([7, "ate", "", false, 9]);

涉及知识点:

  • Arrays.filter() 可以进行过滤并返回过滤后的数组
  • Boolean对象可以通过构造函数对假值进行处理,其自带方法valueOf()返回的是一个boolean基础对象,具体Boolean对象介绍可以查看Boolean对象介绍

14.摧毁数组

问题描述:实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。

具体代码:

function destroyer(arr) {
  // 请把你的代码写在这里
  var result = arguments[0];
  //var arr1 = [...arguments]; //这一种写法也可以
  //需要注意 如果直接将arr传入到filter的回调函数中去的话时不可以的
  var arr1 = Array.from(arguments);
  return result.filter(function(val){
    var bool = true;
    for(var i=1; i<arr1.length; i++){
      if(val == arr1[i]){
        bool = false;
        break;
      }
    }
    return bool;
  });
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

涉及知识点:

  • 利用Arguments对象可以来接收参数,可以直接通过下标来接收,也可以将其转换为一个真实数组,Arguments对象介绍,特别注意filter,没有转成真实数组直接使用上面的arr进入filter是不成功的

15.数组排序并找出元素索引

问题描述:

先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。

举例: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);
  var result = arr.sort(function(a, b){
    return a > b;
  });
  var index = 0;
  for(var i=0; i<result.length; i++){
    if(num === arr[i]){
      index = i;
      break;
    }
  }
  return index;
}

where([5, 3, 20, 3], 5);

涉及知识点:

  • Array.sort排序的用法

16.凯撒密码

问题描述:

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

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

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

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

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

具体代码:

function rot13(str) { // LBH QVQ VG!
  // 请把你的代码写在这里
  var result = '';
  for(var i=0; i<str.length; i++){
    var codeNum = str.charCodeAt(i);
    if(codeNum >= 65 && codeNum <= 90){
      //代表是需要转换的字母
      codeNum += 13;
      if(codeNum > 90){
        codeNum = codeNum - 90 + 65 - 1;
      }
    }
    result += String.fromCharCode(codeNum);
  }
  return result;
}

rot13("SERR PBQR PNZC");  // 你可以修改这一行来测试你的代码

涉及知识点:

  • str.charCodeAt(i)是将字符串第i为字符转为ascii码对应数字
  • String.fromCharCode(codeNum)是将对应数字转化为字符,但是需要注意不能传入一个数组进去




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值