给定一个非负数,表示为数字数组,数字加一个。
这些数字被存储,使得最高有效数字在列表的开头。
给定表示123的[1,2,3],返回[1,2,4]。
给定表示999的[9,9,9],返回[1,0,0,0]。
我的代码不适用于输入[9,8,7,6,5,4,3,2,1,0],输出仅为[9]
谁能告诉我为什么?
public class Solution {
/**
* @param digits a number represented as an array of digits
* @return the result
*/
public int[] plusOne(int[] digits) {
// Write your code here
float n = 0;
for(int i = 0; i < digits.length; i++) {
n = n*10 + digits[i];
}
n++;
String s = Float.toString(n);
s = s.substring(0, s.indexOf("."));
int l = s.length();
int result[] = new int[l];
for(int i = 0; i < l; i++) {
result[i] = Integer.parseInt(Character.toString(s.charAt(i)));
}
return result;
}
}
对于输入[9,8,7,6,5,4,3,2,1,0],n
此代码后的值:
float n = 0; for(int i = 0; i < digits.length; i++) { n = n*10 + digits[i]; } n++;
...是9.8765435E9。然后,继续进行此操作的子字符串,直到小数点为9,因此结果为9。
如果将类型n
从更改float
为long
,并使用将其转换为字符串,效果会更好Long.toString
。
但是创建n
,添加1,然后转换为String,然后转换为数组的整个方法很尴尬,容易出错,并且不能与较大的数组一起使用,因为它会受到整数溢出的影响,除非您更改n
to的类型。BigInteger
。该解决方案不会通过任何测试或编程采访。
考虑一下这种更简单的选择,它可以处理任意多个数字(在数组大小允许的情况下),而不必担心整数溢出:
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; --i) {
digits[i]++;
if (digits[i] < 10) {
return digits;
}
digits[i] = 0;
}
int[] result = new int[digits.length + 1];
System.arraycopy(digits, 0, result, 1, digits.length);
result[0] = 1;
return result;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句