以下两个Java for循环代码是否会在每种情况下产生相同的结果?

时间:2013-12-15 14:50:38

标签: java for-loop

这个问题是关于CodingBat Java部分Array-2的“sameEnds”问题:

  

如果数组开头和结尾的n数字组相同,则返回true。例如,对于{5, 6, 45, 99, 13, 5, 6}n=0n=2以及falsen=1的{​​{1}}的结尾相同。您可以认为n=3的范围为n

CodingBat服务器为所有情况传递代码#2,包括“其他测试”但不代码#1。代码#1仅对所谓的“其他测试”失败。代码#1失败的那些其他测试用例是什么?这两个代码之间有什么区别?

代码#1:

0..nums.length

代码#2:

public boolean sameEnds(int[] nums, int len) {
  for (int i = 0; i < len && len > 0; i++, len--) 
    if (nums[i] != nums[(nums.length) - len]) return false;
  return true;  
}

8 个答案:

答案 0 :(得分:2)

代码1的问题在于,您每次都会递减len,但仍会将其用作i循环中for的结束索引。考虑一下......如果len最初是10,i只会计为5,因为循环5次,i会增加到5和len将减少到5。

您可以将len复制到用于索引的第二个变量,并仅使用len检查i以结束循环。但就我个人而言,无论如何我发现你的“Code 2”更具可读性和干净性,所以我会坚持下去。

答案 1 :(得分:1)

感谢David Norris和其他立即回复此问题的人。我了解到,当for循环框架如下所示

i < len && len > 0; i++, len-- 

根据Code 1的循环提前终止,因为每次迭代都会递减len值。因此,考虑Specification和测试用例

({1, 2, 5, 2, 1}, 5)

循环仅在三次迭代后终止,

0 < 5 && 5 >0
1 < 4 && 4 > 0
2 < 3 && 3 > 0

它应该迭代5次并检查整个子阵列。这就是codingbat服务器不接受Code 1作为确切答案的原因。

我修复了Code 1,如下所示,codingbat服务器已接受解决方案作为正确答案。

更正代码1:

public boolean sameEnds(int[] nums, int len) {
  for (int i = 0; len > 0; i++) {
    if (nums[i] != nums[(nums.length) - len]) return false;
    len--;
  }
  return true;  
}

答案 2 :(得分:0)

不同之处在于,在代码1中,您通过减少它来改变循环内的条件('i&lt; len')。你可以复制'len'来避免这种情况。

答案 3 :(得分:0)

public boolean sameEnds(int[] nums, int len) {
    if (nums.length > 1 && len > 0)
    {
        if (nums[len-1] == nums[nums.length-1])
        {
            return true;
        }

    }
    if (len == 0 || nums.length == 1) return true;
    return false;
 }

答案 4 :(得分:0)

这是使用字符串的解决方案。

public boolean sameEnds(int[] nums, int len) {
    //Create 2 blank strings.
    String testOne = "";
    String testTwo = "";
    //For the amount of len, we make strings starting from each side, and ending at len
    //inwards.
    for (int i = 0; i < len; i++)
    {
      //testOne is for the left side.
      testOne = testOne + String.valueOf(nums[i]);
      //testTwo is for the right side.
      testTwo = String.valueOf(nums[(nums.length - 1) - i]) + testTwo;
    }
    //If they equal, return true. If they don't, return false;
    return (testOne.equals(testTwo));
  }

答案 5 :(得分:0)

这是我的解决方案,比较两个数组:

public boolean sameEnds(int[] nums, int len) {

    int length = nums.length;
    int[] arr = new int[len];

    for (int i = 0; i < arr.length; i++) {
        arr[i] = nums[i];
    }

    for (int i = 0; i < arr.length; i++) {
        if (arr[i] != nums[i+length-len]) return false;
    }

    return true;
}

答案 6 :(得分:0)

这也可能有帮助。

public boolean sameEnds(int[] nums, int len) {
    //  Creating two arrays A & B to store first and last (len) numbers
    int[] arrA = new int[len];
    int[] arrB = new int[len];
    
    // Storing first set of integers in arrA
    for(int i = 0; i <len; i++) {
        arrA[0] = nums[i];
        // System.out.print(arrA[0]);
    }
    // Storing second set of integers in arrB
    int pos = 0;
    for (int j = (nums.length)-len; j < (nums.length); j++) {
        arrB[pos] = nums[j];
         // System.out.println(arrB[pos]);
    }
    // Comparing and returning boolean values
    return Arrays.equals(arrA,arrB);

}

答案 7 :(得分:-1)

    public boolean sameEnds(int[] nums, int len) {

    boolean b = true;

    if (len == 0) {
        b = true;
    }

    for (int i = 0; i < len; i++) {

        if (nums[i] != nums[nums.length - len + i]) {

            b = false;
            break;
        }

    }

    return b;

}