结果看起来像是循环

时间:2018-08-29 13:24:51

标签: java arrays while-loop

我需要一些帮助。显示结果时,我陷入了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。这不是完整的代码,如果您需要更多代码,请在此处发布。谢谢!

1 个答案:

答案 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%不必要,但如果绝对必须使用终止条件,请考虑使用布尔值!