算法题目1:Seek and Destroy(摧毁数组)
金克斯的迫击炮!
实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
帮助资源:
destroyer([1, 2, 3, 1, 2, 3], 2, 3)
应该返回
[1, 1]
.
destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3)
应该返回
[1, 5, 1]
.
destroyer([3, 5, 1, 2, 2], 2, 3, 5)
应该返回
[1]
.
destroyer([2, 3, 2, 3], 2, 3)
应该返回
[]
.
destroyer(["tree", "hamburger", 53], "tree", 53)
应该返回
["hamburger"]
.
思路
函数中有隐式的不确定个数的参数,而我们在函数中将会用到它,很显然,这需要用到 arguments对象;
arguments 是一个类数组对象。代表传给一个function的参数列表。
很显然,既然是类数组对象,说明它不是真正的数组,没有数组所具有的属性和方法(除了 length
属性和索引)。
为了便于我们接下来的运算,我们需要把arr后面的待摧毁的所有参数放进一个数组,使用push()方法
var args = [];
for(var i = 1; i < arguments.length; i++){ args.push(arguments[i]); }
拿到了待摧毁数组,接下来就是用 filter()
方法实现的简单的去重操作了。
arr.filter(function(item,index,array){ return args.indexOf(item) < 0; //小于0,就是没有在待摧毁的数组里查询到,返回-1 });
因为 filter()
不会改变原始数组,所以声明一个变量接收上一步的返回结果,最后整个函数返回这个变量,问题解决啦!
解法
function destroyer(arr) {
// Remove all the values var args = []; for(var i = 1; i < arguments.length; i++){ args.push(arguments[i]); } var temp = arr.filter(function(item,index,array){ return args.indexOf(item) < 0; }); return temp; }
=========================================
算法题目2:凯撒密码
凯撒密码Caesar cipher
,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
帮助资源:
测试用例:
rot13("SERR PBQR PNZC")
应该解码为
"FREE CODE CAMP"
rot13("SERR CVMMN!")
应该解码为
"FREE PIZZA!"
rot13("SERR YBIR?")
应该解码为
"FREE LOVE?"
rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.")
应该解码为
"THE QUICK BROWN DOG JUMPED OVER THE LAZY FOX."
思路
1、26个字母的unicode码在65(A)与90(Z)之间,第13位M(77); 2、将str通过.charCodeAt()转为unicode编码并放入新数组;
其中非字母形式的字符直接放入.charAt(); 后13位字母减去13后放入; 前13位字母加上13后放入; 通过.fromCharCode()转化为字母,将数组转化为字符串;
解法