66.加一
caution
思路
可以考虑从后往前进行操作,主要解决的问题是最后一位加 1 之后产生的进位问题,需要从后往前遍历数组:
- 如果 digits[i] + 1 == 10 了,说明要进位了,则指针需要往前移动一位(循环下次判断就可以判断这位是否加 1 大于 10)
- 如果 digits[i] + 1 小于 10,说明不需要进位,则到此结束为止。
有一种特殊情况,当 digits[0] 为 9 的时候,如果该位需要进位则数组长度会加 1,而且出现这种情况只有所有数都为 9 的时候出现,所以需要判断如果指针到达了数组的开头,那么说明数组长度需要加 1 并且除了第一个数是 1 其他都是 0。
核心思路:类似双指针的思路。
代码
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int sz = digits.size();
if (digits.size() == 1) {
if (digits[0] + 1 == 10) {
digits.pop_back();
digits.push_back(1);
digits.push_back(0);
} else {
int t = digits[0];
digits.pop_back();
digits.push_back(t + 1);
}
} else {
int i;
for (i = digits.size() - 1; i >= 0;) {
if (digits[i] + 1 == 10) {
digits[i] = (digits[i] + 1) % 10;
i--;
} else {
digits[i] ++;
break;
}
}
if (i == -1) {
while (!digits.empty()) digits.pop_back();
digits.push_back(1);
for (int j = 1; j <= sz; j ++) digits.push_back(0);
}
}
return digits;
}
};