java - 结果看起来像一个循环
问题描述
我需要一些帮助。当我显示结果时,我陷入了一个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)。
PS这不是完整的代码,如果您需要更多,我会在这里发布。谢谢!
解决方案
我并没有试图让你的代码变得更好,(即使它可以被重写以提高效率),但我试图让它更具可读性并修复你的错误。我还没有测试过它,但我认为它现在应该可以正常工作了。
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% 不必要的,但如果您绝对必须使用终止条件,请考虑使用布尔值!
推荐阅读
- mysql - 不应该返回任何东西的 MySQL 查询,返回一条记录
- java - 什么时候可以增加 jvm (-Xss) 的最大堆栈大小?
- c++ - 不能将结构分配给向量的索引吗?
- twilio - 在房间里从拨号盘收集数字
- bash - 如果“特定”列的行匹配,则比较“特定”列的行并连接其他列
- c# - Selenium 问题关闭弹出窗口
- flutter - 覆盖 operator== 是否有助于避免重建?
- python - 如何在 Python 中结合以下理解?
- python - 如何在 docker(Azure Web App)中为 Python 导入 cv2?
- python - 在条件上接收 Python unindent 错误我认为缩进看起来正确