首页 > 解决方案 > 结果看起来像一个循环

问题描述

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

标签: javaarrayswhile-loop

解决方案


我并没有试图让你的代码变得更好,(即使它可以被重写以提高效率),但我试图让它更具可读性并修复你的错误。我还没有测试过它,但我认为它现在应该可以正常工作了。

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


推荐阅读