携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 1000 <= 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)