我需要一些帮助。显示结果时,我陷入了while循环中。让我向您展示代码,输入和结果。
这是代码:
import java.util.Scanner;
public class Main {
public static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int n = scanner.nextInt();
int[] array = new int[n];
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
int x = scanner.nextInt();
int[] sortedArray = sortedArray(array);
int st = 0;
int dr = n - 1;
int ok = 0;
int mij;
while (st <= dr && ok == 0) {
mij = (st + dr) / 2;
if (sortedArray[mij] == x) {
System.out.println(sortedArray[mij]);
ok = 1;
} else {
if (x > sortedArray[mij]) {
if((dr - mij) % 2 != 0){
st = mij + 1;
} else {
st = mij;
}
} else if (x < sortedArray[mij]) {
if((mij - st) % 2 != 0) {
dr = mij - 1;
} else {
dr = mij;
}
}
System.out.println(sortedArray[mij]);
}
}
}
public static int[] sortedArray(int[] array) {
int[] sortedArray = new int[array.length];
for (int i = 0; i < sortedArray.length; i++) {
sortedArray[i] = array[i];
}
int temp;
for (int i = 0; i < sortedArray.length - 1; i++) {
for (int j = i + 1; j < sortedArray.length; j++) {
if (sortedArray[i] > sortedArray[j]) {
temp = sortedArray[i];
sortedArray[i] = sortedArray[j];
sortedArray[j] = temp;
}
}
}
return sortedArray;
}
}
这是输入: 11 20 40 11 54 100 56 67 45 24 21 78 50`
结果如下:
45
67
56
54
54
54
54
54
54
54
54
54
54
因此您可以看到54连续出现。我认为那是错。结果不错,但我需要退出此循环以获得最后一个结果(54)。
P.S。这不是完整的代码,如果您需要更多代码,请在此处发布。谢谢!
答案 0 :(得分:0)
我没有尝试使您的代码更好,(即使可以将其重写为更有效的方式),但我试图使其更具可读性并修复您的错误。我尚未对其进行测试,但我认为它现在应该可以正常工作。
Scanner scanner = new Scanner(System.in);
int arraySize = scanner.nextInt();
int[] array = new int[arraySize];
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
int requestedNumber = scanner.nextInt();
int[] sortedArray = sortedArray(array);
int left = 0;
int right = arraySize-1;
int i;
while(true)
{
i = (left + right) / 2;
if (sortedArray[i] == requestedNumber)
{
System.out.println("Found requested element -> "+array[i]);
break;
}
else if(i == left || i == right)
{
System.out.println("Could not find requested element -> "+requestedNumber);
break;
}
else
{
if (requestedNumber > sortedArray[i])
{
if ((right - i) % 2 != 0)
left = i + 1;
else
left = i;
}
else if (requestedNumber < sortedArray[i])
{
if ((i - left) % 2 != 0)
{
right = i - 1;
}
else
right = i;
}
}
System.out.println(sortedArray[i]);
}
注意:用作循环终止条件的变量“ ok” (整数)对于您提供的代码而言100%不必要,但如果绝对必须使用终止条件,请考虑使用布尔值!