2017-07-18 37 views
0

陣列表示數問題去如下:加1,由數字

鑑於表示爲數字陣列的非負數, 添加1〜數(遞增由數字表示的號碼) 。 數字的存儲方式使得最重要的數字位於列表的開頭。

解決方案:

class Solution { 
     public: 
      vector<int> plusOne(vector<int> &digits) { 
       reverse(digits.begin(), digits.end()); 
       vector<int> ans; 
       int carry = 1; 
       for (int i = 0; i < digits.size(); i++) { 
        int sum = digits[i] + carry; 
        ans.push_back(sum%10); 
        carry = sum/10; 
       } 
       while (carry) { 
        ans.push_back(carry%10); 
        carry /= 10; 
       } 
       while (ans[ans.size() - 1] == 0 && ans.size() > 1) { 
        ans.pop_back(); 
       } 
       reverse(ans.begin(), ans.end()); 
       reverse(digits.begin(), digits.end()); 
       return ans; 
      } 
    }; 

這是同時在一個門戶網站解決我遇到的解決方案..

我不明白這一點:

while (ans[ans.size() - 1] == 0 && ans.size() > 1) { 
       ans.pop_back(); 
      } 

爲什麼我們需要這個while循環?我嘗試自我評估例如9999的代碼,我無法理解從最後彈出整數的邏輯! 請幫忙。

+2

我不認爲這是必要的,除非'數字'本身可以有前導零,但所需答案不允許它,沒有意義嗎? – shole

+0

作爲一個提示,像這樣的情況下,你可以簡單地測試所有的情況下0,1,2,... 9,看看是否需要邏輯。由於多位或單位數字不是您的核心關注點(這裏的計算數學顯然是正確的) – shole

回答

3

邏輯

while (ans[ans.size() - 1] == 0 && ans.size() > 1) { 
    ans.pop_back(); 
} 

刪除任何0的末由1

的值遞增後的邏輯是模糊的,沒有必要的,因爲你永遠不會需要不斷尋找xyz..0000在答案集。

雖然邏輯構建器可能具有的示例:9999將更改爲0000100,因此他刪除0將轉換轉換爲00001,將其反轉爲10000,但由於此方案不會發生,因此應刪除該代碼從邏輯。