首页 > 代码库 > [LeetCode] Plus One

[LeetCode] Plus One

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.

 

  这题有意思啊,虽然是easy题但我还是折腾了很久,一开始做出一个逗比解法:把数组读出来拼装成数字,然后加1,再拆成数组。然后还自作聪明的处理了溢出的情况。结果发现人家根本不对范围有限制,也就是即使数组里面是一亿也要返回一亿零一。所以那个想法还是图样图森破。所以只能对数组做操作了。。。 

  但是处理加1就要考虑进位的问题,而进到最后就要多出一位数,多出一位数就意味着要往数组头塞进一个数,要往数组头塞进一个数跟重新创建一个新数组没区别,所以这题应该是没有很好的 In place 解法。

  然后就要考虑怎么实现加1这个操作了: 如果数字不是9的话就直接加1,如果是9的话就要变成0并且把进位设为1....

这样貌似很复杂,一时不知道怎么写,case估计也很多,要判断具体值和进位,But...其实仔细思考以后发现,加1操作其实和进位并没有本质区别。

把一个数加1其实跟一个数的小数部分进了一位到个位上没有什么区别。所以,把加1和进位操作为一类动作后问题也就简单了。

  思路就是:把进位初始值设为1,从数组末尾往回扫,取到一个数就把他加上进位,然后除以10算出新的进位,模以10算出新值,把新值push进栈。

这样到扫描完的时候,再检查一下最后的进位值是否为1,是的话就把1push进栈。最后把栈倒进数组返回就行了。

这里需要注意的是:

1.便利结束后还需检查最后是否还有进位

2.这样从低位到高位逐个产生数的顺序是反的,需要反过来,这里就用栈来做逆序操作。

vector<int> plusOne(vector<int> &digits) {    int carry = 1;    int ptr = (int)digits.size() - 1;    vector<int> ret;    if (ptr < 0) return ret;    stack<int> s;    for (int i = ptr; i >= 0; i--) {        int val = digits[i] + carry;        carry = val / 10;        val = val % 10;        s.push(val);    }    if (carry) {        s.push(1);    }        while (!s.empty()) {        ret.push_back(s.top());        s.pop();    }        return ret;}

 

另附逗比版:

vector<int> plusOneDoge(vector<int> &digits) {    int t = 0;    for (int i = 0; i < digits.size(); i++) {        if (t > INT_MAX / 10) {            t = INT_MAX - 1;            break;        }        t = t * 10 + digits[i];    }    t += 1;    vector<int> ret;    stack<int> s;    while (t) {        s.push(t % 10);        t /= 10;    }        while (!s.empty()) {        ret.push_back(s.top());        s.pop();    }        return ret;}
逗比版

 

[LeetCode] Plus One