2017-03-14 22 views
1

所以我有一個函數需要一個數組(例如[7,4,5]),函數應該增加一個(所以,[7,4,6])。我已經建立了功能,它的工作原理!但我無法弄清楚這種情況:[1,9,9,9]應該變成[2,0,0,0],但它只是[2]無法弄清楚如何添加一個零來遞增函數

我提供了下面的功能。任何建議將是超級有用的。我真的做了遞歸,但它似乎是個好主意。

function increment(arr){ 
    let num = arr.pop(); 
    if(num === 9){ 
    increment(arr); 
    } else { 
    arr.push(num + 1); 
     console.log(arr);  
    } 
} 
+0

它應該如何處理'[9,9,9]'? – Rayon

+0

[9,9,9]應該變成[1,0,0,0]。 –

+0

Ooooh我完全忽略了這一點。哈。嗯... –

回答

3

你可以加入數組值,然後將它們分割備份是這樣的:

function increment(arr) { 
 
    let num = Number(arr.join("")); 
 
    return String(num + 1).split("").map(Number); 
 
} 
 

 
console.log(increment([1, 9, 9, 9]));

+0

同樣的問題,@布賴恩麥考爾,硫返回字符串返回而不是int。這意味着如果不將其轉換回來,您將無法再使用它。 – jdmdevdotnet

+1

'console.log(newArr。map(Number));'並且不要忘記返回被操作的'array' – Rayon

+0

@jdmdevdotnet那麼,函數本身實際上是返回undefined - 但是,即使它不是,它並不重要,因爲Number( arr.join(「」))'將它強制爲一個數字,而不管數組中的值是字符串還是ints – mhodges

0

怎麼樣加入數組元素在一起,然後解析int和增加1,那麼它強制轉換爲字符串,並分裂成數數組

​​3210
+0

這個問題是它返回字符串而不是int。這意味着如果不將其轉換回來,您將無法再使用它。 – jdmdevdotnet

+0

是的,我想到它後編輯它 –

0

先轉換陣列Number遞增它由1,然後將其轉換回array

var arr=[9,9,9]; 
 
function increment(){ 
 
var anum=Number(arr.join(""));//converting arr to number 
 
anum++;  //incrementing the number 
 
var newArr=anum.toString().split("") 
 
alert(newArr); //final new array 
 
} 
 
increment();

0

你可以使用Array#reduceRight並保存攜帶unshifting。

它適用於任何大小的陣列。

function inc(array) { 
 
    var carry = array.reduceRight(function (r, a, i, aa) { 
 
      var v = a + r; 
 
      aa[i] = v % 10; 
 
      return Math.floor(v/10); 
 
     }, 1); 
 
    carry && array.unshift(carry); 
 
    return array; 
 
} 
 

 
console.log(inc([7, 4, 5])); 
 
console.log(inc([1, 9, 9, 9])); 
 
console.log(inc([9, 9, 9, 9, 9]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

能否請你解釋一下reduceRight :) –

+1

它與減少一樣,但是它從右側開始。該索引從'array.length - 1'變爲零。 –

0

你忘遞增9

function increment(arr) { 
 
    if (!arr || !arr.length) return [1]; 
 

 
    let num = arr.pop(); 
 

 
    if (num === 9) { 
 
    let newArr = increment(arr) 
 
    newArr.push(0); 
 
    return newArr; 
 
    } else { 
 
    arr.push(num + 1);  
 
    } 
 
    
 
    return arr; 
 
} 
 

 
console.log(increment([0])); 
 
console.log(increment([1,9,9])); 
 
console.log(increment([9,9,9,9]));

0

後爲0追加儘管目前給出的答案是正確的,其運行時間是線性取決於輸入元素的數量= O(n)。下面的解決方案運行 - 平均 - 在恆定時間= O(1):

// Increment array: 
 
function increment(arr) { 
 
    let carry = 1; 
 
    for (let i = arr.length - 1; i >= 0 && carry > 0; --i) { 
 
    arr[i] += carry; 
 
    carry = Math.floor(arr[i]/10); 
 
    arr[i] %= 10; 
 
    } 
 
    while (carry > 0) { 
 
    arr.unshift(carry % 10); 
 
    carry = Math.floor(carry/10); 
 
    } 
 
    return arr; 
 
} 
 

 
// Example: 
 
console.log(increment([9, 9]));

for循環的上述迭代次數收斂向90對於n >> 50,從而它平均運行時間不變。最壞情況的時間複雜度仍然是線性的。