2017-05-07 40 views
1

數組A = [1,0,1,1,1,1,0,1,1]]; 結果將是B B = [1,0,4,3,2,1,0,2,1]; 給出了A的元素,結果爲B. A中的元素只能是0和1. 我們需要從A中的最後一個元素向後計數,如果有連續的1,那麼A和B中的元素將會是1但是連續第二次1在A中它將會在2中並且對於第三個在A中元素將會在B中爲3 但是0它將會是0.我已經嘗試了下面的方式,但我不是獲得輸出。應該從數組A中獲得數組B的正確算法

<script> 

var A= [1,0,1,1,1,1,0,1,1]]; 
var B =[]; 
//var B= A.length; 

var lastValueOne; 
var consecutiveOnes = 0; 

for (i = A.Length - 1; i >= 0; i--) 
    { 
     if (lastValueOne== false) 
     { 
       consecutiveOnes = 0; 
       B[i] = 0; 
     } 
     else 
     { 
      consecutiveOnes++; 
      B[i] = consecutiveOnes; 
     } 

     if (A[i] == 1) 
     { 
      lastValueOne = true; 
     } 

     else 
     { 
      lastValueOne = false; 
     } 
    } 

    //console.log(B[i]); 
document.getElementById("demo").innerHTML = B; 
+2

問題是什麼?你的解決方案出了什麼問題? – Meier

+0

我沒有得到輸出。 –

+0

你會得到哪個輸出? – Meier

回答

2

如果在實際索引處給出真值,則可以迭代給定數組並映射計數值。然後迭代,直到找到一個falsy值並返回計數。

var array = [1, 0, 1, 1, 1, 1, 0, 1, 1], 
 
    result = array.map(function (_, i, a) { // take only index and array as parameter 
 
     var count = 0;      // declare and initialize counter with zero 
 
     while(a[i++]) {      // check value at actual index and inc index 
 
      count++;      // increment counter while true/truthy 
 
     } 
 
     return count;      // return count 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

移動le_manswer位超前的想法不使用sum變量和使用該結果陣列r[0]的第一元件,用於保持的累積和。

var array = [1, 0, 1, 1, 1, 1, 0, 1, 1], 
 
    result = array.reduceRight(function (r, a) { 
 
     return [a && (r[0] || 0) + a].concat(r); 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

非常感謝你,只需要一個請求,你可以請詳細說明一下函數(_,i,a)@ninaScholz –

+0

謝謝,順便說一下,它是如何向後添加? –

+0

如果你的意思是第一種方法,它使用一個循環來看看下一個元素和dexide是否添加或離開計數循環。第二個從右側進行迭代,並使用最後一個元素的值來爲實際值進行添加。 –

0

您應該只增加consecutiveOnes如果說去年值爲1,當前值也爲1 但邏輯可以simplier,因爲當最後一個值是假的,你連續值也應爲0

var A= [1,0,1,1,1,1,0,1,1]; 
var B = []; 
var consecutiveOnes = 0; 

for (i = A.length - 1; i >= 0; i--) 
    { 
     if (A[i] == 1) 
     { 
      consecutiveOnes += 1; 
     } 
     else 
     { 
      consecutiveOnes = 0; 
     } 
     B[i] = consecutiveOnes; 
    } 

console.log(B); 
1

更具描述性的Array.reduceRight很適合您的從右向左計算累計總和的任務。

// Return cumulative sums from right, reset on zero: 
 
function cumSumRight(array, sum = 0) { 
 
    return array.reduceRight((result, a) => { 
 
    sum = a > 0 ? sum + a : 0; 
 
    result.unshift(sum); 
 
    return result; 
 
    }, []); 
 
} 
 

 
// Example: 
 
console.log(cumSumRight([1,0,1,1,1,1,0,1,1])); // [1,0,4,3,2,1,0,2,1]

要解決當前的解決方案,寫A.length而不是A.Length。您可以簡化爲:

let sum = 0; 
for (let i = A.length - 1; i >= 0; i--) { 
    sum += A[i]; 
    if (A[i] === 0) { 
    sum = 0; 
    } 
    B.unshift(sum); 
} 
+0

你可以使用'result [0]'來省略'sum'。 –

+1

@NinaScholz是的,但是保存一個'Number'分配真的值得嗎? ;) –

+2

這是一個味道的問題... –

相關問題