LeetCode 66. Plus One

本文解析了LeetCode中一道经典题目“加一”的多种解题思路,重点介绍了一种直接在数组上进行操作的高效算法,该算法通过从后向前遍历数组,判断并处理每一位的进位情况,实现对非负整数的加一操作,代码简洁优雅,时间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Given a non-empty array of digits representing a non-negative integer, plus one to the integer.

The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit.

You may assume the integer does not contain any leading zero, except the number 0 itself.

Example 1:

Input: [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.

Example 2:

Input: [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.

这是一道看似很简单但实则我踩坑无数的一道题,大意就是,给你一个全是一位数字的数组,需要返回另一个全是一位数字的数组,且这个数组是原数组直接变成数字以后加一的结果。

第一反应,这不是很简单吗,直接把原数组转换为int然后+1以后转回数组就好了。然而写代码写着写着发现这么做复杂了,可以直接判断末尾是不是9,如果是9的话变0、前一位+1,不是的话直接+1就行(错误示范),提交以后发现还是too young啊,居然只考虑了最后一位的进位,没想到其他位上也能进位orz

于是,我又快乐地切换回最初的做法,快乐地提交,发现WA——test case是从9到0的降序,我居然给它生成出负数来了,仔细一想这妥妥的overflow了,卒。怀抱着侥幸心理把int改成long long试了一下,依旧,卒。看来只能对数组直接操作了啊。

昨天看过一点discussion里的思路,然后今天倒腾了半天终于倒腾出一个算法,只需要从后向前遍历整个数组,如果遇到的数字不是9,那么就可以放心大胆地直接+1返回,如果碰到的是9,那么就要把这位变成0然后继续遍历。接下来的遍历会出现两种情况,一种情况是剩下的全是9,那么最后将会返回一串的0然后退出循环,这时候就需要在循环外把这个数组的头部加个1(可以采用insert());而如果遇到的数字不是9,那么就是前面所说的+1返回,这里的+1就相当于进位了,返回回来没毛病。整个代码非常简洁优雅,而且感觉这个方法非常巧妙,时间复杂度O(n),运行时间0ms:

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int carry = 0;
        for (int i = digits.size() - 1; i >= 0; i--) {
            if (digits[i] != 9) {
                digits[i]++;
                return digits;
            }
            else {
                digits[i] = 0;
            }
        }
        digits.insert(digits.begin(), 1);
        return digits;
    }
};

Discussion里还有一些其他的解法,感觉都是上面这种解法的变体,大同小异,我还是觉得这种方法比较好理解一点,嗯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值