关于java中for循环条件的一个问题
我正在解决以下问题: 给定一个表示非负整数的非空数字数组,加上整数的1。 例如:[1,2,3]输出:[1,2,4] 我的方法是使用进位法从头到尾计算单数。 我得到了这个问题的两个版本。当输入为[1,4,4,9]时,第一个不起作用。但是,第二个是wokring。在第二个版本中,我更改了for循环条件。我想知道为什么会这样?有人能帮我吗?任何帮助都将不胜感激!谢谢 第1版:关于java中for循环条件的一个问题,java,loops,for-loop,Java,Loops,For Loop,我正在解决以下问题: 给定一个表示非负整数的非空数字数组,加上整数的1。 例如:[1,2,3]输出:[1,2,4] 我的方法是使用进位法从头到尾计算单数。 我得到了这个问题的两个版本。当输入为[1,4,4,9]时,第一个不起作用。但是,第二个是wokring。在第二个版本中,我更改了for循环条件。我想知道为什么会这样?有人能帮我吗?任何帮助都将不胜感激!谢谢 第1版: public static int[] plusOne(int[] digits) { int sum
public static int[] plusOne(int[] digits) {
int sum = 0;
int len = digits.length;
int carry = (digits[digits.length -1]+1)/10;
digits[digits.length -1] = (digits[digits.length -1]+1)%10;
for (int j = len-2;j >= 0;j--){
carry = (digits[j]+carry)/10 ;
digits[j] =(digits[j]+carry)%10 ;
}
if (carry==0) return digits;
else{
int[] res = new int[len+1];
res[0] = 1;
int i = 0;
for (int j=1;j<res.length;j++){
res[j] = digits [i++];
}
return res;
}
}
public static int[]复数(int[]位){
整数和=0;
int len=位数。长度;
整数进位=(位数[位数.长度-1]+1)/10;
数字[digits.length-1]=(数字[digits.length-1]+1)%10;
对于(int j=len-2;j>=0;j--){
进位=(数字[j]+进位)/10;
数字[j]=(数字[j]+进位)%10;
}
如果(进位==0)返回数字;
否则{
int[]res=新的int[len+1];
res[0]=1;
int i=0;
对于(int j=1;j=0;j--){
int temp=数字[j]+进位;
进位=(温度)/10;
数字[j]=(温度)%10;
}
如果(进位==0)返回数字;
否则{
int[]res=新的int[len+1];
res[0]=1;
int i=0;
对于(intj=1;j发布一个更长的答案毕竟
这两个代码片段的唯一区别是
循环的第一个。您的第一个示例没有按预期工作
for (int j = len-2;j >= 0;j--){
carry = (digits[j]+carry)/10 ;
digits[j] =(digits[j]+carry)%10 ;
}
这里的问题在于行进位=(数字[j]+进位)/10;
您正在更改变量carry
,但该值将在下一行中使用
比如说,carry
是1
而digits[j]
是5
。在carry=(digits[j]+carry)/10之后;
变量carry
变为0
,随后对digits[j]/code>的计算结果是5
,而不是6
第二个示例有效,因为您引入了一个中间变量temp
:
for (int j = len-2;j >= 0;j--){
int temp = digits[j]+carry;
carry = (temp)/10 ;
digits[j] =(temp)%10 ;
}
temp
只计算一次,然后从中读取,因此carry
和digits
不再相互依赖。反过来,您将得到预期的结果。在任何条件下都没有变化。唯一的区别是在示例2中使用了temp
变量。示例1不起作用,因为您正在计算digits[j]=(digits[j]+carry)%10;
其中carry
在前一行中已更改。在第一个解决方案中,carry
的值在表达式digits[j]=(digits[j]+carry)中已更改%10、
在前一行。在第二个示例中,您已将计算分配给循环中的temp
变量。QBrute基本上回答了这个问题。下次我建议您使用调试器-它在这种情况下非常有用。
for (int j = len-2;j >= 0;j--){
int temp = digits[j]+carry;
carry = (temp)/10 ;
digits[j] =(temp)%10 ;
}