给定一个像这样的数组:
var buckets = [
{name: "bucket1", value: 10000},
{name: "bucket2", value: -5000},
{name: "bucket3", value: -2000},
]我正在尝试将负数“清零”。在给定的每种情况下,所有值相加的总和永远不会为负。我所说的“清零”的意思是取任何正数,然后按出现的顺序将它们减去负数。
所以如果第一个数和第三个数是负的,第二个数是正的,它会把第二个数减第一个数,然后再减第三个数。
之后,我的示例的结束值将分别为3000,0,0-。
这些数字可以以任何组合和顺序出现,只要它们的和都是正数。
发布于 2019-08-31 05:46:39
这不是最好的解决方案,但是像这样的东西应该可以工作。
伪码:
// for every item in the bucket
for(var i = 0; i < buckets.length; i++){
// if the value of this bucket is negative
if(buckets[i].value < 0) {
// look through every bucket again
for(var j = 0; j < buckets.length; j++) {
// and if we find one that is positive
if(buckets[j].value > 0) {
// add all the positive to this negative
buckets[i].value += buckets[j].value;
// if it's still negative we are gonna start again
if(buckets[i].value < 0) {
i--;
break;
}
}
}
}
} 发布于 2019-08-31 06:23:47
您可以在数组上执行reduce,并通过正/负值分隔存储桶。然后迭代负片,将每个负片减去一个正数,直到它达到零,然后根据需要移动到下一个。
var buckets=[{name:"bucket1",value:1e4},{name:"bucket2",value:-5e3},{name:"bucket3",value:-2e3}],
result = buckets.reduce( ( a, v, i, {
length
} ) => {
let isNeg = Math.sign( v.value ) == -1;
isNeg ? a.n.push( v ) : a.p.push( v );
if ( i < length - 1 ) {
return a;
} else {
return [ ...a.n.map( n => {
while ( n.value < 0 ) {
let pos = a.p.find( ( {
value
} ) => value > 0 ),
tval = n.value + pos.value,
nval, posval;
if ( tval >= 0 ) {
nval = 0;
posval = tval;
} else {
nval = tval;
posval = pos.value + n.value;
}
pos.value = posval;
n.value = nval;
}
return n;
} ), ...a.p ]
}
}, {
p: [],
n: []
} );
console.log( result );
https://stackoverflow.com/questions/57733465
复制相似问题