吾日三省吾身
还记得的梦想吗
正在努力实现它吗
可以坚持下去吗
目录
颜文字
(¬‿¬) | (◕‿◕) |
٩(◕‿◕。)۶ | ͡~ ͜ʖ ͡°) |
(^‿^) | (。♥‿♥。) |
玩儿去吧
力扣题号:66. 加一 - 力扣(LeetCode)
注:下述题目描述和示例均来自力扣
题目描述
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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
思路
思路:模拟
情况处理
-
特殊情况处理: 如果数组只包含一个元素且该元素为9,或者数组的最后一位是9,需要进行特殊处理。
-
普通加一操作: 如果数组的最后一位不是9,直接将最后一位加一。
-
复杂情况处理: 如果数组最后一位是9,需要考虑进位的情况。采用从最后一位开始往前遍历的方式,进行进位操作。
-
扩容: 如果最高位有进位,需要在数组的最前面进行扩容。
代码逻辑解释
- 获取数组的最后一个元素的索引。
- 判断数组是否只有一个元素且该元素为9。如果是,则需要对数组进行扩容操作,新数组的长度为原数组长度加1,且新数组的第一个元素为1,第二个元素为0,其余元素与原数组相同。然后返回新数组。
- 判断数组的最后一个元素是否为9。如果不是,则将最后一个元素加一后返回数组。
- 如果最后一个元素为9,则需要进一步处理。
- 从最后一个元素开始遍历数组,如果当前元素为10(即前一位进一位后当前位变为0),则继续向前进位。
- 如果当前元素不是第一个元素且当前元素为10,或者最后一个元素加一后为10,则将当前元素置为0,并将前一位加一。
- 最后返回处理后的数组。
这份代码的时间复杂度为O(n),其中n为数组的长度。
注意事项
- 代码中使用了数组拷贝的方法,通过
System.arraycopy
实现数组的扩容和元素的复制。 - 通过判断数组元素是否等于10,避免了显式的进位标志。
- 对于特殊情况和普通情况分别进行处理,提高代码的可读性和简洁性。
Java代码实现
class Solution {
public int[] plusOne(int[] digits) {
int last = digits.length - 1;
// 判断是不是只有一个九
if (last == 0 && digits[last] == 9) {
// 是第一位扩容
int[] first = new int[last + 2];
System.arraycopy(digits, 0, first, 1, last + 1);
first[0] = 1;
first[1] = 0;
return first;
}
// 判断是不是普通的加一
if (digits[last] != 9) {
digits[last] += 1;
return digits;
} else {
// 好,事情并不简单
int position = last;
// 这里的最后一位等于九
while (position >= 0) {
// 第一位是 10 ,那么需要扩容
if (position == 0 && digits[position] == 10) {
int[] first = new int[last + 2];
System.arraycopy(digits, 0, first, position, last + position);
first[position] = 1;
first[position + 1] = 0;
digits = first;
}
// 这里判断的是 非第一位发现是10,那么需要进位
if (position != 0 && digits[position] == 10 || digits[last] + 1 == 10) {
// 不是第一位是9,那么前一位加一,这一位变成零
digits[position - 1] += 1;
digits[position] = 0;
}
position--;
}
}
return digits;
}
}
wdf,都是绿的,太爽了
C++代码实现
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int last = digits.size() - 1;
// 判断是不是只有一个九
if (last == 0 && digits[last] == 9) {
// 是第一位扩容
vector<int> first(last + 2);
copy(digits.begin(), digits.end(), first.begin() + 1);
first[0] = 1;
first[1] = 0;
return first;
}
// 判断是不是普通的加一
if (digits[last] != 9) {
digits[last] += 1;
return digits;
} else {
// 好,事情并不简单
int position = last;
// 这里的最后一位等于九
while (position >= 0) {
// 第一位是 10 ,那么需要扩容
if (position == 0 && digits[position] == 10) {
vector<int> first(last + 2);
copy(digits.begin(), digits.end(), first.begin() + position);
first[position] = 1;
first[position + 1] = 0;
digits = first;
}
// 这里判断的是 非第一位发现是10,那么需要进位
if (position != 0 && (digits[position] == 10 || digits[last] + 1 == 10)) {
// 不是第一位是9,那么前一位加一,这一位变成零
digits[position - 1] += 1;
digits[position] = 0;
}
position--;
}
}
return digits;
}
};
该说不说,C++是真的省内存呐
总结
不难,但是有点绕,建议先写一个思路图出来再写代码,不然真的容易绕进去
ヾ( ̄▽ ̄)Bye~Bye~~~