इस तरह एक सरणी को देखते हुए:

var buckets = [
  {name: "bucket1", value: 10000},
    {name: "bucket2", value: -5000},
    {name: "bucket3", value: -2000},
]

मैं ऋणात्मक संख्याओं को "शून्य" करने का प्रयास कर रहा हूं। दी गई प्रत्येक स्थिति में, एक साथ जोड़े गए सभी मानों का योग कभी भी ऋणात्मक नहीं होगा। "शून्य आउट" से मेरा मतलब है कि कोई भी सकारात्मक संख्या लें, और उन्हें नकारात्मक संख्याओं से कम करें, जिस क्रम में वे दिखाई देते हैं।

इसलिए यदि पहली और तीसरी संख्या ऋणात्मक है, और दूसरी संख्या धनात्मक है, तो यह दूसरी संख्या को पहले से कम कर देगी, और फिर तीसरी संख्या से।

मेरे उदाहरण के अंतिम मान बाद में क्रमशः ३०००, ०, ० - होंगे।

संख्याएँ किसी भी संयोजन और क्रम में प्रकट हो सकती हैं, जब तक कि उन सभी का योग सकारात्मक हो।

0
wdfc 31 अगस्त 2019, 00:35

2 जवाब

सबसे बढ़िया उत्तर

यह सबसे अच्छा समाधान नहीं है लेकिन ऐसा कुछ काम करना चाहिए।

छद्म कोड:

// 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;
        }
      }
    }
  }
} 
2
Zachary McGee 31 अगस्त 2019, 00:46

आप ऐरे पर 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 );
1
zfrisch 31 अगस्त 2019, 01:23