Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于java中for循环条件的一个问题_Java_Loops_For Loop - Fatal编程技术网

关于java中for循环条件的一个问题

关于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

我正在解决以下问题: 给定一个表示非负整数的非空数字数组,加上整数的1。 例如:[1,2,3]输出:[1,2,4] 我的方法是使用进位法从头到尾计算单数。 我得到了这个问题的两个版本。当输入为[1,4,4,9]时,第一个不起作用。但是,第二个是wokring。在第二个版本中,我更改了for循环条件。我想知道为什么会这样?有人能帮我吗?任何帮助都将不胜感激!谢谢 第1版:

   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 ;
}