问题描述:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
算法思路:
我自己的思路是先将digits数组中的元素转变成整数sum,然后sum加一,将加一后的sum再转成一个新的数组,新数组的长度可能会比之前的数组多一。但此方法未通过,原因是在转换成整型的时候可能会会出现越界异常。
代码实现(java):
class Solution {
public int[] plusOne(int[] digits) {
int sum = 0;
int j = 0;
for(int i = digits.length - 1; i >= 0; i--){
sum = sum + digits[i]*(int)Math.pow(10,(digits.length-i-1));
}
// System.out.println(sum);
sum = sum + 1;
int size = digits.length + 1;
int[] newDigits = new int[size];
while(sum != 0){
newDigits[j] = sum % 10;
sum = sum / 10;
j++;
}
// System.out.println(newDigits[1]);
int[] newDigits1 = new int[size];
int num = 0;
for(int k = newDigits.length - 1; k >= 0; k--){
newDigits1[num] = newDigits[k];
num++;
}
int[] newDigits2 = new int[num-1];
if(newDigits1[0] == 0){
System.arraycopy(newDigits1, 1, newDigits2, 0, num-1);
return newDigits2;
}else{
return newDigits1;
}
}
}
别人巧妙的方法:
看了别人的方法,感觉就是,妙啊!
class Solution {
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;
}
}
要点总结:
- Math数学函数的API,可以看到pow()方法返回第一个参数的第二个参数次方,格式为Math.pow(m,n),代表m的n次方。
- 反转数组
创建一个新数组接收并返回;
var arr1 = [1,2,3];
var arr2 = reverse1(arr1);
console.log(arr2);
console.log(reverse1(arr1));
//定义一个新数组,把原数组中的元素反向添加到新数组中
function reverse1(array){
var newArr = [];
for(var i=array.length-1;i>=0;i–){
newArr[newArr.length] = array[i];
}
return newArr;
} - 使用.arraycopy方法进行数组截取
使用方法:System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,拷贝长度)。