日新刷题 - 66. 加一

100 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

66. 加一 - 力扣(LeetCode) (leetcode-cn.com)

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [0]
输出:[1]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

二、思路分析:

虽然是简单题,但感觉这里思路还是挺有意思的

首先,由于加法是由低位向高位进行的

所以我们想到了FILO性质的栈,在弹栈的过程中+1

由于题目要求+1,而除了末位以外的所有位只有两种情况

要么保持不变,要么由于前一位的进位导致自己+1

因此我们可以初始化进位标志为1,这样就将所有位统一起来了

最后别忘了可能由于进位使得数字总长度+1,这时要手动在最高为前再添一个1

三、AC 代码:

class Solution
{
public:
    vector<int> plusOne(vector<int> &digits)
    {
        stack<int> stk;
        for (int i = 0; i < digits.size(); i++)
        {
            stk.push(digits[i]);
        }
        bool carry = 1;
        vector<int> ans;
        while (!stk.empty())
        {
            int n = stk.top();
            stk.pop();
            if (carry)
                n++;
            carry = n / 10;
            ans.insert(ans.begin(), n % 10);
        }
        if(carry)
            ans.insert(ans.begin(),1);
        return ans;
    }
};

范文参考:

【微扰理论】模拟题 - 从低到高位依次+1并判断是否进位 - 加一 - 力扣(LeetCode)

高效解法,python,附详细注释和实例解释 - 加一 - 力扣(LeetCode)

66题C语言写法,思路简单,代码超级容易实现 - 加一 - 力扣(LeetCode)