在while循环中运行多次迭代

时间:2016-11-10 07:47:18

标签: java while-loop

我试图解决在数组中找到最小和第二小元素的问题。

我正在考虑在数组的第0个索引上放两个指针。两个指针都从左向右移动遍历整个阵列。第一指针ptr1确定min元素,而第二指针意图确定第二min元素。第一个指针工作正常,但第二个指针不遍历。 while循环仅在第二次指针的1次迭代后退出。

  

是否可以在while循环中使用n个指针&让他们穿越   从左到右依次转弯?

或者我做错了什么。

以下是代码

int arr[] = {12,13,1,10,34,1}; 
        int ptr1 = 0;
        int ptr2 =0;
        int min = Integer.MAX_VALUE;
        int minSec = Integer.MAX_VALUE;
        int arrLen=arr.length-1;

        while(ptr1<arrLen && ptr2<arrLen){

            if(arr[ptr1]<min){  // this if works great finds the min element
                min=arr[ptr1];
                ptr1++;
            }else{
                ptr1++;
            }

            //flow enters once & exits the while loop
            if(ptr1==arrLen && arr[ptr2]<minSec && arr[ptr2]>min){
                minSec=arr[ptr2];
                ptr2++;
            }else if(ptr1==arrLen){
                ptr2++;
            }
        }

      System.out.println("min: " + min + " second min: "+ minSec)

输出:min: 1 second min: 12

正确的输出应为min: 1 second min: 10

我可以用另一种方法解决问题,代码如下。我只需要了解while循环方法。

for (int i = 0; i <= arrLen ; i ++)
        {
            /* If current element is smaller than first
              then update both first and second */
            if (arr[i] < min)
            {
                minSec = min;
                min = arr[i];
            }

            /* If arr[i] is in between first and second
               then update second  */
            else if (arr[i] < minSec && arr[i] != min)
                minSec = arr[i];
        }

4 个答案:

答案 0 :(得分:1)

因为ptr2值为0,直到循环到达结尾

if(ptr1==arrLen && arr[ptr2]<minSec && arr[ptr2]>min){
                minSec=arr[ptr2];
                ptr2++;
}

并仅输入if条件ptr1==arrLen,然后选择minSec值为minSec=arr[ptr2]。没有必要把这个条件放在这里。

所以第二个条件就像

if(arr[ptr2]<minSec && arr[ptr2]>min){
   minSec=arr[ptr2];
   ptr2++;
}else{
   ptr2++;
}

答案 1 :(得分:0)

你的问题是即使找到最小的数字,第一个if语句仍然有效。因此,遍历遍历的元素要么大于等于最小的数字。这意味着指针1每“步骤”递增一次。在第二个if语句中,检查指针1是否等于数组长度,但这种情况只出现在一个“while step”中。

PS:让java对您的数组进行排序。这项工作已经为你完成了;)

答案 2 :(得分:0)

你不需要两个指针

int arr[] = {12,13,1,10,34,1}; 
final int arrLen=arr.length;
int min = Integer.MAX_VALUE;
int minSec = Integer.MAX_VALUE;
for (int e=0; e<arrLen; e++) {
    final int v = arr[e];
    if (v<minSec && v>min)
        minSec = v;
    if (v<min && v<minSec)
        min = v;
}
if (min>minSec)
    min = minSec;

答案 3 :(得分:0)

问题出在这个while(ptr1<arrLen && ptr2<arrLen)语句中,只有当ptr1长度时才移动第二个指针。

ptr1在arrLen时会发生什么,所以第二个指针迭代一次,但因为当&&被评估为假时你使用ptr1<arrLen整个循环退出。使用或不解决此问题,因为代码中存在其他问题会导致IndexOutOfBoundsError。