原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2cv1c/
解法一:
public static int[] plusOne(int[] digits) {
int max = 15;
int length = digits.length;
int d = length/max + (length%max != 0 ? 1 : 0);
String[] strs = new String[d];
for (int i = 0; i < d; i++) {
StringBuilder vStr = new StringBuilder();
for (int j = i*max; j < digits.length && j < (i+1)*max; j++) {
vStr.append(digits[j]);
}
strs[i] = vStr.toString();
}
int x = 1;
for (int i = strs.length-1; i >= 0; i--) {
boolean flag = strs[i].startsWith("0");
if (flag) {
int zero = 0;
String sTemp = strs[i].substring(1);
while(sTemp.startsWith("0")) {
sTemp = sTemp.substring(1);
zero++;
}
long vInt = Long.parseLong(strs[i]);
vInt = vInt + x;
String s = vInt+"";
if (s.length() == strs[i].length() ) {
x = 1;
strs[i] = s;
} else {
for (int i1 = 0; i1 < zero; i1++) {
s = "0" + s;
}
strs[i] = "0" + s;
x = 0;
}
} else {
long vInt = Long.parseLong(strs[i]);
vInt = vInt + x;
x = 0;
String s = vInt+"";
if (i != 0 && s.length() != strs[i].length()) {
x++;
strs[i] = s.substring(1);
} else {
strs[i] = s;
}
}
}
int clength = 0;
StringBuilder resultStr = new StringBuilder();
for (int i = 0; i < strs.length; i++) {
clength = clength + strs[i].length();
resultStr.append(strs[i]);
}
char[] chars = resultStr.toString().toCharArray();
int[] result = new int[clength];
for (int i = 0; i < chars.length; i++) {
result[i] = (int)chars[i] - (int)('0');
}
return result;
}
思路:这种方法是一个不是很推荐的方法,在看到这个题的时候,心想这个题怎么这么简单,不就是在原来的数值上加一么?它的用例说明也不是特别的好!
但是跑一下用例就会知道,这个题其实考察的就是一个进位的问题,我的想法是将数组的值拼接起来,通过number类型的值进行强转,然后加一,最后在转换为数组,完事!!!
看,想法是不是特别好,也特别天真,问题来了,当输入的数组长度非常大的时候,number类型就会强转失败,那么,怎么解决这个问题呢,我的做法就是将一个比较长的数组分为好几段,在进行运算。
但是这样还是有问题。问题就是如果分出来的字符串开头为0,那么就会出现丢位问题,所以这里要做判断,而且判断还要进行连续,因为可能连续出现0。最后将没一个分段的结果进行结合,最后的结果就是我们需要的值。
解法二:
class Solution {
public int[] plusOne(int[] digits) {
int length = digits.length;
for (int i = length - 1; i >= 0 ; i--) {
if (digits[i] != 9) {
digits[i]++;
return digits;
} else {
digits[i] = 0;
}
}
int[] tmp = new int[length+1];
tmp[0] = 1;
return tmp;
}
}
思路:数组从后开始遍历,若数组元素不是9则加一直接返回,否则将当前元素设置为0,数组遍历结束后,还要最后判断一个特殊值,如果数组元素都为9,那么遍历出来的结果就会变为0...0,所以需要添加一个临时的变量,长度为原来数组长度加一,第一个元素为1即可。