我试图解决在数组中找到最小和第二小元素的问题。
我正在考虑在数组的第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];
}
答案 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。