基本挑战是通过将相邻克隆加在一起来减少一系列数字(具有连续重复):
const sumClones = (numbers) => {
if (Array.isArray(numbers)) {
return numbers.reduce((acc, elem, i, arr) => {
if (elem !== arr[i - 1]) acc.push(elem);
else acc[acc.length - 1] += elem;
return acc;
}, []);
}
};
sumClones([1,1,2,1,1,1,1,2,1,1,1])=> [2,2,4,2,3]
现在,我尝试编写另一个函数reduceClones,递归运行sumClones,使最终输出不包含连续重复
const reduceClones = (numbers) => {
let result = sumClones(numbers);
while (result[0] === result[1]) {
result = sumClones(result);
}
return result;
};
reduClones([1,1,2,1,1,1,1,2,1,1,1])=> [8,2,3]
有更好的方法吗?
答案 0 :(得分:0)
res
直到消耗输入数组function reduceConsecutiveClones(nums, res) {
if(!nums.length) { return res || []; }
if(!res) {
res = [];
nums = nums.slice();
}
let sum = first = nums.shift();
while(first === nums[0]) {
sum += nums.shift();
}
return reduceConsecutiveClones(
nums,
res.concat(sum)
);
}
function reduceClones(nums, res = reduceConsecutiveClones(nums)) {
return res.toString() === nums.toString()
? res
: reduceClones(res)
;
}
console.log(
reduceConsecutiveClones([1,1,2,1,1,1,1,2,1,1,1]),
reduceClones([1,1,2,1,1,1,1,2,1,1,1])
);
{{1}}
答案 1 :(得分:0)
通过以Haskellesque方式使用数组解构,您可以执行以下操作;
function sumNeigboringDupes([x1,x2,...xs]){
function add2Head(a,[b,...rest]){
return [a+b].concat(...rest);
}
return xs.length ? x1 === x2 ? add2Head(x1,sumNeigboringDupes([x2,...xs]))
: [x1].concat(sumNeigboringDupes([x2,...xs]))
: x1 === x2 ? [x1 + x2]
: [x1, x2 || []];
}
var arr = [1,1,2,1,1,1,1,2,1,1,1,4,4,1];
console.log(JSON.stringify(sumNeigboringDupes(arr)));
对于
[x1,x2,...xs]
函数的参数, 提示 sumNeigboringDupes
只需要一个数组并将x1
分配给第一个项目x2
第二项和xs
是一个分配给数组其余部分的数组。 add2Head
函数参数的数组解构也以类似的方式工作。