题目
给出原文字符串str,通过对字符串的每个字母进行改变来实现加密,加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量。
数组a的前三位已经赋值:a[0]=1,a[1]=2,a[2]=4,当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。
例如:原文abcde加密后bdgkr,其中偏移量分别是1,2,4,7,13。
输入输出描述
- 输入描述:第一行是整数n,表示n组测试数据。 每组数据包含一行,原文str(只含有小写字母,长度大于0小于50)。
- 输出描述:每组测试数据输出一行,表示密文。
示例
示例1
- 输入
1
xy- 输出
ya
示例2
- 输入
2
xy
abcde- 输出
ya
bdgkr
思路
- 偏移量计算-使用递归
- charCodeAt()知道字母的ASCII码,与26个字母的下标找关系
以下代码自己构造了一个函数,没有像牛客网上构造输入输出,可以自己考虑下哦~
代码
// 26个字母
let letter = 'abcdefghijklmnopqrstuvwxyz';
// 加密字符串的方法
let protectStr = function(num, arr) {
// 偏移量计算-使用递归
let pianyi = function (i) {
if (i === 0) {
return 1;
} else if (i === 1) {
return 2;
} else if (i === 2) {
return 4;
} else if (i >= 3) {
return pianyi(i-1)+pianyi(i-2)+pianyi(i-3);
}
}
// 提前知道a和z的ASCII码
const zCharCode = 'z'.charCodeAt();
const aCharCode = 'a'.charCodeAt();
let res = '';
for (var i = 0; i < num; i++) {
for (var j = 0; j < arr[i].length; j++) {
let originChar = parseInt(arr[i][j].charCodeAt());
let pianyiNum = parseInt(pianyi(j))
let sum = originChar + pianyiNum;
let index;
if (sum <= zCharCode) {
// 计算letter字符串的下标
index = sum - aCharCode;
} else {
index = sum - zCharCode - 1;
}
// 最后的结果
res += letter.charAt(index);
}
// 这里是为了输出好能一行一行的输出,所以加了一个分隔区分一下
if (i < num -1) {
res += '-';
}
}
console.log(res.split('-').join(`\n`));
}
protectStr(3,['ab','abcde', 'abcde']);
运用到的知识点技巧
- 递归
- ‘a’.charCodeAt()方法,返回字符a的ASCII码
- str.charAt(num)方法,返回str字符串中下标为num的字符