我想检查是否可以将数组拆分为具有相同总和的连续子数组。拆分数组还意味着删除数组的边框元素。
例如,要将其分为3部分,我们需要将其删除为元素
myArray = [2, 4, 5, 3, 3, 3, 2, 1, 3]
^ ^
通过删除2个元素,可以得到3个连续的子数组,它们的总和为[2, 4]
,[3, 3]
和[2, 1, 3]
。
因此,如果有可能将数组分成3个部分(相等的总和)并删除它们之间的边界-它应该返回true,否则应该返回false。
将返回false
的示例是[1, 1, 1, 1, 1, 1]
。因为在删除2个元素之后,它将有1
的4个元素,它们不能分为3个相等的总和
我不知道该如何解决这个问题,任何建议都是有帮助的。
答案 0 :(得分:2)
您可以从左侧和右侧添加值,如果相等,则得到其余值的总和,并检查该值是否等于一侧。
如果未在左侧添加一个值。
function check(array) {
var i = 0,
j = array.length - 1,
left = array[i++],
right = array[j--];
while (i < j) {
if (left < right) { left += array[i++]; continue; }
if (left > right) { right += array[j--]; continue; }
if (array.slice(i + 1, j).reduce((a, b) => a + b, 0) === left) return true;
left += array[i++];
}
return false;
}
console.log(check([2, 4, 5, 3, 3, 3, 2, 1, 3]));
console.log(check([1, 1, 1, 1, 1, 1]));
答案 1 :(得分:2)
我会做这样的事情。
myArray = [2, 4, 5, 3, 3, 3, 2, 1, 3];
var x = []; //result if sub-arrays
var i = 0;
while(i< myArray.length-3){
x.push([myArray[i],myArray[i+1]])
i = i+3;
};
var a =[]; //remaining element
for(var k =i; k<myArray.length;k++){
a.push(myArray[k]);
}
x.push(a)
console.log(x);
var sum =x[0].reduce((a, b) => a + b, 0);
var returnTrue = true;
for(var k=1; k<x.length; k++){
var sumAnother = x[k].reduce((a, b) => a + b, 0);
if(sumAnother!== sum){
returnTrue = false;
break;
}
}
console.log(returnTrue);