题目描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
题解
常规思路(java)
思路:难得读完题目就可以有一点思路,代码有点啰嗦,但还是先贴上来吧。
主要是针对两种情况:非9 和 9。对除9以外的数字加一即可;对9的情况,要考虑进位,同时要注意进位后会使得返回值需要多一位空间。
class Solution {
public int[] plusOne(int[] digits) {
int index = digits.length - 1;
boolean isAllNine = true;
for (; index >= 0; index --) {
if ( digits[index] != 9 ) {
isAllNine = false;
}
}
if (isAllNine) {
int[] ans = new int[digits.length + 1];
ans[0] = 1;
return ans;
}
index = digits.length - 1;
digits[index] ++;
for (; index >= 0; index --) {
if ( digits[index] == 10 ) {
digits[index] = 0;
if (index - 1 != -1) {
digits[index - 1] += 1;
}
}
}
return digits;
}
}
题解里大佬的做法类似,思路有区别,这个更清晰。
- 对当前位判断9或非9。
- 非9:加一,跳出。
- 9:赋0,看下一位。
- 回到第一步。
- 如果到数组的位置0,依然是9,则新建数组,位置0赋1。
同时写法细节上有一点区别,copy过来作参考。
public int[] plusOne(int[] digits) {
int n = digits.length;
for(int i=n-1; i>=0; i--) {
if(digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
int[] newNumber = new int [n+1];
newNumber[0] = 1;
return newNumber;
}
小总结:
- 命名方面:见名知意的习惯还是比较重要。
- 为了阅读方便,会把nums.length赋值给n, 看循环条件时会清晰一点。
数组数值转换(python)
思路: 把该数组通过乘10的方式转换为数值,加一后通过变字符串再转回数组。nb。
def plusOne(digits):
num = 0
for i in range(len(digits)):
num += digits[i] * pow(10, (len(digits)-1-i))
return [int(i) for i in str(num+1)]
来源:CSDN
作者:Chen_2018k
链接:https://blog.csdn.net/Chen_2018k/article/details/104451025