给定 包含整数的数组 A = [a_0, a_1, a_2, ..., a_n],求 [a_1 - a_0, a_2 - a_1, ..., a_n - a_n-1]
我尝试用 Array 的 rotate 方法,得到 A.rotate = [a_1, a_2, ..., a_n, a_0],但是我找不到一种方法对 A.rotate 和 A 做向量减运算。
A.rotate.zip(A).take(A.count - 1).map{ |pair| pair[0] - pair[1] }
这样?
其实下面这个也可以吧
A.take(A.count - 1).map.with_index{ |v, index| A[index + 1] - v }
ruby 手生,提供一个 js 版本供参考
var _ = require('underscore');
function map (datas, cal, init) {
function iter (datas, prev, now) {
if (datas === undefined || datas.length === 0) {
return now;
}
var current = _.first(datas);
var item = cal(current, prev);
return iter(_.rest(datas), current, now.concat(item) );
}
return _.rest(iter(datas, 0, []));
}
var ret = map([1,2,3,4,5], function(current, prev) {
return current - prev;
}, 0);
console.log(ret);// => [ 1, 1, 1, 1 ]
function curry3 (func) {
return function(last) {
return function(middle) {
return function(first) {
return func(first, middle, last);
};
};
};
}
var sub_each = curry3(map)(0)(function(c, p) { return c - p;});
console.log(sub_each([1,4,5,6,1,100])); // => [ 3, 1, 1, -5, 99 ]
map
方法会给原数组中的每个元素 (必须有值) 都调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组。callback 函数只会在有值的索引上被调用; 那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Array/map