目录
题目链接: https://leetcode-cn.com/problems/plus-one/
一、题目描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
二、解法
考虑可能的三种情况:
- 例如:1 2 3 4 末尾加1, 无进位
- 例如:1 9 9 9 末尾加1,存在进位, 但结果还是四位
- 例如:9 9 9 9 末尾加1,存在进位, 并且进位会导致位数加1
三、代码思路:
1)先处理 9,9,9,9
可以想到,加1之后进位,并产生新的数字的情况只有每一位都是9。
所以这个可以作为一种特殊情况单独写。
2)再处理 1,2,3,4 & 1,9,9,9
解决第一种特殊情况之后,我们可以保证其他情况都不会产生新的位(原来是几位就是几位)。
设立一个虚拟的指针p从后往前遍历。
digit[p] + 1 只会小于等于10
a)如果digit[p]+1 == 10 , 那么让digits[p] = 0,并让p -- ,并让前一位做相同的操作。
b) 如果digit[p]+1 != 10 , 那么让digits[p] = digits[p]+1,此时可以结束循环
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int len = digits.size();
// 9..9
//遍历一遍digits
//如果存在不等于9的位,flag = 0
//否则flag再循环结束的时候会保持1不变
int flag = 1;
for(int i = 0 ; i < len ; i++)
if(digits[i] != 9){
flag = 0;
break;
}
if(flag){ //确认是9..9的格式
digits[0] = 1;
for(int i = 1; i < len ;i++)
digits[i] = 0;
digits.push_back(0);
return digits;
}
//1234 && 1999
//设立p指针从最后以为向 ← 遍历
//temp用来保存digits[p]+1
//再次用到flag变量,如果在计算过程中没有进位(temp!=10),则可以提前结束循环
int p = len - 1;
int temp;
flag = 1;
while(flag && p >= 0){
temp = digits[p] + 1;
digits[p] = temp%10;
if(temp != 10) flag = 0;
p--;
}
return digits;
}
};