要求:
凯撒密码
(让上帝的归上帝,凯撒的归凯撒)
下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由’A’ ↔ ‘N’, ‘B’ ↔ ‘O’,以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
提示:
- charCodeAt()
- String.fromCharCode()
凯撒密码,相对于其他的题来说,会相对绕一些。但是也不是很难。
思路:
- ROT13的思路入手,先把传入字符串参数的每个字符拆分成Unicode,保存在一个数组中。
- 对这个数组进行处理,处于大写字母的Unicode码区间是65~90,遍历数组,不符合这个范围的直接返回。
- 符合范围的,进行ROT13的规则进行处理,每一个Unicode码值加上13,超出范围后,重头开始。
写出来的第一版:
function rot13(str) {
var arr=[];
var arr2=[];
for(var i =0;i<str.length;i++){
arr.push(str.charCodeAt(i));
}
arr = arr.map(function(x){
if(x<65 || x>90){
return x;
}
else{
if(x+13>90){
return x+13-26;
}
else{
return x+13;
}
}
});
for(var j = 0; j<arr.length;j++){
arr2.push(String.fromCharCode(arr[j]));
}
str =arr2.join('');
return str;
}
rot13("SERR PBQR PNZC");
进行优化后:
function rot13(str) {
var arr =[];
for(var i=0;i<str.length;i++){
if(str.charCodeAt(i)<65 ||str.charCodeAt(i)>90){
arr.push(String.fromCharCode(str.charCodeAt(i)));
}
else if(str.charCodeAt(i)>77){
arr.push(String.fromCharCode(str.charCodeAt(i)-13));
}
else{
arr.push(String.fromCharCode(str.charCodeAt(i)+13));
}
}
return arr.join('');
}
rot13("SERR PBQR PNZC");