Leetcode: Plus One

yxwkaifa發表於2016-04-22

題目:
Given a non-negative number represented as an array of digits, plus one to the number.

The digits are stored such that the most significant digit is at the head of the list.

題目意思是說給定一個數這個數以陣列的形式表示,就是說這個數各個位上的數儲存在一個陣列裡面,然後給這個數加一。求返回的結果。當然仍舊以陣列的形式返回。

C++演示樣例程式碼:

class Solution {
public:
    vector<int> plusOne(vector<int> &digits)
    {
        vector<int>::size_type size = digits.size();
        //當digits的每一位都是9的時候,由於返回的結果位數要新增1。所以做一個特殊處理。

bool flag = true; for (size_t i = 0; i < size; i++) { if (9 != digits[i]) { flag = false; } } if (flag) { digits.resize(size + 1); digits[0] = 1; for (size_t i = 1; i <= size; i++) { digits[i] = 0; } return digits; } //當digits的每一位並不都是9的時候 //假設最後一位不是9,直接加一返回 if (digits[size - 1] != 9) { digits[size - 1]++; return digits; } //假設最後一位是9,則變成0,前面一位加一,假設加一以後變成10。則迴圈進行這種處理 else { digits[size - 1] = 0; digits[size - 2]++; for (int i = size - 2; i >= 0; i--) { if (10 == digits[i]) { digits[i] = 0; digits[i - 1]++; } } } return digits; } };

我寫的程式碼看起來比較繁瑣,看到網上有高手這樣做的:

class Solution 
{
public:
    vector<int> plusOne(vector<int> &digits) 
    {
        vector<int> ret(digits);
        reverse(ret.begin(), ret.end());

        int flag = 1;
        for(int i = 0; i < ret.size(); i++)
        {
            ret[i] += flag;
            //這裡的flag的結果要麼是0。要麼是1
            flag = ret[i] / 10;
            ret[i] %= 10; 
        }

        if (flag == 1)
            ret.push_back(1);

        reverse(ret.begin(), ret.end());

        return ret;
    }
};

只是,最後這兩段程式碼我們Leetcode上提交以後都用時是4ms!肯能是後者的程式碼中用了兩次vector的reverse略微佔了一些時間吧。

相關文章