有人可以解释这两个循环之间的区别吗?

时间:2015-07-07 03:01:34

标签: java loops debugging

   while(n>= 0 && nums[n] == value){  
        n--;
    }

   while(n>=0 && nums[n--] == value){
   }

我认为这两个循环应该完全相同。发生的是我运​​行测试用例输入[4,5]值= 4。并获得一个超出边界的数组索引。但是,如果我可以进入另一个循环,它就可以了。

public int removeElement(int[] nums, int val) {
    if(nums.length == 0) return 0;
    // use two pointers, n for the right most of the item, which value != val. 
    // i for the start pointer. 
    int n = nums.length-1;
    int i = 0;
    while(n>= 0 && nums[n--] == val){ 
    }

    while(i <= n){
        // as long as the curr items is equal to the valu
        // replace it by the right most of the value, decrement the n
        // pointer, until find another item which is not equal to val. 
        if(nums[i] == val){
            nums[i] = nums[n]; //
            while(n >= 0 && nums[--n] == val){
            }
        }
        i++;   
    }
    return n+1;
}

3 个答案:

答案 0 :(得分:8)

它们不一样。

在第一个循环中,n仅在n >= 0nums[n] = value时才会递减。

public void loop1() {
    int n = 0;
    int[] nums = new int[]{1};
    int value = 2;

    // n >= 0 is true
    // nums[n] == value is false
    // Therefore while condition is false and n is NOT decremented
    while(n>= 0 && nums[n] == value){  
        n--;
    }
    // n = 0
    System.out.println("n=" + n);
}

在第二个循环中,无论n是真还是假,n >= 0都会递减nums[n] == value

public void loop2() {
    int n = 0;
    int[] nums = new int[]{1};
    int value = 2;

    // n >= 0 is true
    // nums[n--] == value executes in 2 steps:
    //  1.  nums[n] == value
    //  2.  n = n - 1 WILL EXECUTE regardless of result being true/false
    while(n>= 0 && nums[n--] == value){  
    }
    // n = -1
    System.out.println("n=" + n);
}

答案 1 :(得分:0)

在执行循环语句

之前,这个减去n的值为1
 while(n>=0 && nums[n--] == value){

}

这一个在循环内部减少一个n的值(它可以是循环的最后一个语句或第一个内部语句)

while(n>= 0 && nums[n] == value){  
    n--;
}

答案 2 :(得分:0)

while(n>= 0 && nums[n] == value){  
    n--;
}

也就是说,当n大于或等于零时,存储在索引n的nums数组中的值等于名为value的变量,将n减1。如果n等于0,当n减小到-1时,它将在下一次迭代时中断循环,因为第一个条件是n> = 0。

while(n>=0 && nums[n--] == value){
}

这是说当n大于或等于零并且存储在索引中的nums数组中的值减1时,保持循环,同时将n的值减小1。这里的问题是,当n等于0时,第一个条件为真,但第二个条件将失败。也就是说,nums [-1]会将索引抛出边界异常。