2017-07-18 8 views
0

の配列によって表される数に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

'digits'自体が先行ゼロを持つことはできませんが、それを許さない答えが必要なのではないかと思います。 – shole

+0

ヒントとして、このような場合は、すべてのケースを0,1,2、... 9として簡単にテストし、ロジックが必要かどうかを確認するだけです。複数の桁または1桁はあなたの中心的な関心事ではありません(ここでの計算は明らかです) – shole

答えて

3

ロジック

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

は、ロジックが曖昧であり、あなたがxyz..0000を見つけ、これまで必要とすることはないので、必要とされていない1

で値をインクリメントした後、最後に任意の0年代を削除します回答セットに含まれています。

ロジックビルダが持つ可能性がある例:9999は0000100に変更されるため、変換を00001に変換して10000に変換しますが、このシナリオは決して発生しないため、コードを削除する必要がありますロジックから。

関連する問題