一:问题描述
题目:加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
二:问题分析
这个问题需要考虑一种特殊情形:最后一位为9。此时需要向前进位,又需要考虑前一位为9的情形,以此类推。
遇见问题时我的第一反应为直接判断最后一位是否为9,据此进行不同处理,提交时发现需要考虑最后一位之前几位也都为9的特殊情况和只有一个9的特殊情况。该种解法fail。
我的第二种解法是将数组转成int型整数,然后处理后转换回来。此时遇见的问题时,数字会超过int范围,换成long型整数依旧存在这种情况。该种解法依旧fail。
如下为第二种解法的错误代码,以后编程中可能会用到:
class Solution {
public int[] plusOne(int[] digits) {
StringBuilder digit=new StringBuilder("");
for(int d:digits){
digit.append(d);
}
long num=Long.parseLong(digit.toString());
num=num+1;
String res=Long.toString(num);
char[] result=res.toCharArray();
int[] results=new int[result.length];
for(int i=0;i<results.length;i++){
results[i]=result[i]-48;
}
return results;
}
}
第三种思路,定义一个count变量,用于从个位开始记录遍历每一位进位,初始值设为1,代表加一。这种方法参考了最优解,解法巧妙在使用carry变量代表是否进位。代码见模块三。
三:问题求解
public class PlusOne {
public int[] plusOneSolution(int[] digits){
int carry=1;
for(int i=digits.length-1;i>=0;i--){
if(carry==0){
return digits;
}
int tmp=digits[i]+carry;
carry=tmp/10;
digits[i]=tmp%10;
}
if(carry==1){
int[] res=new int[digits.length+1];
res[0]=1;
return res;
}
return digits;
}
}