等差数组还原

最近在论坛看到一个GOOGLE面试题(原帖: [url]http://www.iteye.com/topic/1056568[/url]), 有点兴趣就动手试了一下, 结果还比较满意.

我认为, 本题的考点不在于如何将原数组转成目标数组(循环除2就完了), 而是在于如何将目标数组还原到原数组,
因此, 前段代码没有给出, 只给出了如何还原的代码, 以表我的思路:

var ArrayRecovery = function(){
var map = {},
analyze = function(ary){
//循环比对每个数之间的差值, 计录每个差值的命中率
for (var i=0, a, b; ary && i<ary.length-1 && (a=ary[i]) && (b=ary[i+1]); i++) {
if (a == b) map[a] = (map[a]||0) + 1;
else if (a > b) while (a << 1 > b << 1){
map[b-a] = (map[b-a]||0) + 1;
b <<= 1;
}else while (a << 1 < b << 1){
map[b-a] = (map[b-a]||0) + 1;
a <<= 1;
}
}
},
getDiff = function(ary){
var maxhit, allhit = [];
analyze(ary||[]);
for (var o in map) allhit.push(map[o]);
maxhit = Math.max.apply(this, allhit);
//差值命中率最高的则为该序列等差值
for (var o in map)
if (map[o] == maxhit) return o;
return 0;
},
recovery = function(ary, diff, rate){
var newAry = [], max = Math.max.apply(this, ary), maxIndex = 0;
//获得序列中最大数以及其在序列中的位置, 以其为标量按等差计算其余还原数
for (var i in ary){
if (ary[i] != max) continue;
maxIndex = i;
break;
}
for (var i in ary)
newAry.push((max+(i-maxIndex)*diff)<<rate);
return newAry;
},
printAry = function(ary){
if (console) console.log(ary);
else if (alert) alert(ary.join(','));
else if (println) println(ary);
};
this.recovery = function(ary, rate){
if ((ary = ary || []).length < 2) return printAry(ary);
printAry(recovery(ary, getDiff(ary)||0, rate||0));
};
};

代码中传递的参数rate为原数组中能被2整除的最小次数, 他影响还原放大的结果, 此数值应该在第一步从原数组转换到目标数组时进行记录, 如不给此参数, 得到的还原数为最小等差序列.

测试

new ArrayRecovery().recovery([1, 63, 47, 125, 39, 187, 109, 249, 35, 311, 171])
//OUTPUT [32, 63, 94, 125, 156, 187, 218, 249, 280, 311, 342]
new ArrayRecovery().recovery([1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11], 5)
//OUTPUT [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352]
new ArrayRecovery().recovery([11, 5, 9, 1, 7, 3, 5, 1, 3, 1, 1, 0, -1], 5)
//OUTPUT [352, 320, 288, 256, 224, 192, 160, 128, 96, 64, 32, 0, -32]
new ArrayRecovery().recovery([-108, -81, -54, -27, 0, 27, 54, 81], 2)
//OUTPUT [-432, -324, -216, -108, 0, 108, 216, 324]
new ArrayRecovery().recovery([1, 3, 19])
//OUTPUT [17, 18, 19] <--- WRONG
new ArrayRecovery().recovery([1, 3])
//OUTPUT [2, 3]
new ArrayRecovery().recovery([1])
//OUTPUT [1]
new ArrayRecovery().recovery([])
//OUTPUT []

小弟认为代码算法上仍有可以优化之处, 比如可以寻找一种算法, 没有必要对整个数组进行全对比, 以得到差值命中率表, 希望各位大大给出意见...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值