freeCodeCamp的JS数据结构五道算法(一)

1. 回文检查器

如果传入的字符串是回文字符串,则返回 true。 否则返回 false

回文 palindrome,指在忽略标点符号、大小写和空格的前提下,正着读和反着读一模一样。

注意:检查回文时,你需要先去除所有非字母数字的字符(标点、空格和符号),并将所有字母都转换成大写或都转换成小写。

我们会传入具有不同格式的字符串,如 racecar、RaceCar 和 race CAR 等等。

我们也会传入一些包含特殊符号的字符串,例如 2A33a2、2A3 3a2、2_A33#A2。

1.1 想法

  1. 已知条件:传入的参数有字符串和数字两种,检查回文时要去除所有的标点符号。
  2. 判断方法:正数的字符串和倒着数的字符串相等,即为回文字符串
  3. 代码相关知识点:replace()

1.2 JS代码

function palindrome(str) {
 // 先把传入的字符串转换成小写
 //利用正则表达式将非字母数字下划线(\W),空格(\s),都(/g)替换掉
  let oriStr = str.toString().toLowerCase().replace(/[\W\s_]/g,'')
  //将新的字符串拆分 - 反转 - 拼接 成反转字符串
  let newStr = oriStr.split('').reverse().join('')
  // 比较两个字符串是否相等
  if (oriStr === newStr) return true;
    else { return false }
}
//测试
palindrome("eye");

2. 罗马数字转换器

把传入的数字转为罗马数字。

转换后的罗马数字字母必须都是大写。

2.1 想法

想要解决这个问题,先要知道罗马字符串的计数原理。

  1. 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
    在这里插入图片描述
  • 相邻两个罗马字符值,如果左边大于右边,加上左边的值,例如:IV = 5 - 1 = 4
  • 相邻两个罗马字符值,如果左边小于右边,减去左边的值,例如:VI = 5 + 1 = 6
  • 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
  1. 做法:把所有罗马字符和其数字分别存到数组中,对数字数组进行遍历,每发现数组中的值大于输入的值,那么就把对应的罗马字符添加到result,第二次再循环时用输入(num)减去数字(number),重复操作。
    4. 代码相关知识点: forEach

2.2 JS代码

function convertToRoman(num) {
// 存放罗马字符对应的数字
   var number = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
//存放罗马字符
   var roman_number =["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"];
//存放罗马字符结果
  let result = ''
// 遍历数值数组,寻找对应的数值
  number.forEach((item, index, array) => {
    while(num >= item) {
    // 添加罗马字符到result中
      result += roman_number[index]
      num -= item
    }
  })

 return result;
}

convertToRoman(36);

3. 凯撒密码

凯撒密码( Caesar cipher)是最简单且最广为人知的密码(ciphers),也被称为移位密码(shift cipher)。
在移位密码中,明文中的字母通过按照一个固定数目进行偏移后被替换成新的字母。

ROT13 是一个被广泛使用的加密技术,明文中的所有字母都被移动 13 位。 也就是, A ↔ N,B ↔ O 等等。

编写一个函数,它将 ROT13 编码的字符串作为输入并返回解码字符串。

所有解码后的字母都必须为字母大写。 请不要解码非字母的字符(例如,空格、标点符号),但你需要在结果中保留它们。

3.1 想法

1.理解题意,明文中所有字母都被移动13位A ↔ N(+13),B ↔ O (-13).解码后的字母必须大写,不要解码非字母的字符(例如,空格、标点符号),但需要在结果中保留。
2. 用split将字符串转换成数组,如果字符串中的数组在预设的数组中,则进入下一个判断。 判断字符串是不是小于13,小于则偏移+13,若大于13则偏移-13。(26为字母表长度,即为一个循环)
3. 代码相关知识点:indexOf()

3.2 JS代码

function rot13(str) {
// 预设字母表
  let alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
  //字符串转数组
  let arr = str.split('');
  let newArr = [];
  for(let i = 0; i < arr.length; i++){
  // 是否存在字母表中
    if(alphabet.indexOf(arr[i]) !== -1){
      if(alphabet.indexOf(arr[i]) <= 12)
      // 小于 12 ,偏移 +13
        newArr.push(alphabet[alphabet.indexOf(arr[i]) + 13]);
      else
      // 大于 12 ,偏移 -13
        newArr.push(alphabet[alphabet.indexOf(arr[i]) + 13 - 26]);
    }
    else newArr.push(arr[i]);
  }
  return newArr.join('');


}

rot13("SERR PBQR PNZC");

版权声明:本文为CathyleeQ原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。