链接:加一
题目描述:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
代码如下:(算法思想见注释,关于进位的设计比较巧妙)
package pid66;
public class Solution {
public static int[] plusOne(int[] digits){
/*
* 结果数组的长度有两种情况:
* 1.若最高位<9:与原数组等长
* 2.若每一位都是9,那么最高位需要进位:等于原数组长度+1
*/
int length = digits.length;
int flag = 1;//最高位进位标志,1表示最高位需要进位,0表示不需要
int result[] = null;
for(int i=0;i<length;i++){
if(digits[i] != 9){
flag = 0;
}
}
//依据上述判断结果确定结果数组的长度,由于flag==1只代表一种情况,可以直接给出结果数组
if(flag == 1){
result = new int[length+1];
result[0] = 1;
for(int i=1;i<length+1;i++){
result[i] = 0;
}
}else if(flag == 0){
result = new int[length];
/*
* 若最后一位为9,则需要设置进位变量carry;
* 否则不需要设置进位变量carry。
*/
int carry = 1;//将需要加的1赋给进位,假设是下一位传过来的
for(int i=length-1;i>=0;i--){//因为需要加的数和进位都是1,所以可以混合处理
if(carry == 1){
if(digits[i] == 9){
result[i] = 0;
}else{
result[i] = digits[i]+carry;
carry = 0;
}
}else if(carry == 0){
result[i] = digits[i];
}
}
}
return result;
}
public static void main(String[] args) {
int[] digits1 = {9,9,9,9,9};
int[] result1 = plusOne(digits1);
for(int i=0;i<result1.length;i++){
System.out.println(result1[i]);
}
}
}
性能表现一般: