Java查找数组中缺失的数字

7vhp5slm  于 2022-10-30  发布在  Java
关注(0)|答案(3)|浏览(248)

我正在尝试学习Java,我自己只有3个星期(从YouTube视频和博客),这是我的第一门语言。我想写一个程序来寻找一个升序整数数组中丢失的数字。我找到了一个方法,但它只适用于增量数组中的最后一个数字小于10的情况。比如1,2,3,4,5,6,7,8,9,10。
我也在网上找到了其他程序,但它们都有同样的问题。
我试着用我有限的3周知识自己写,并成功了。但我想我走了很长的路。代码几乎有27行长。
下面的代码是一个包含9个元素的整数数组:[12、13、17、18、20、21、24、25、26]和第14、15、16、19、22、23项缺失
第一个
我得到了我想要的,但有没有更好的方法来做到这一点?
顺便说一句,如果我想让代码更美观,它会变得很大:D
第一个

oiopk7p5

oiopk7p51#

你看起来似乎把事情弄得太复杂了,因为一个简单的嵌套for循环可能就是你所需要的。外层循环遍历数组,直到但不包括最后一个数字,内层循环在数组中的一个项到下一个项之间循环,从arr[i] +arr[i + 1]。注意,如果两个数组项是连续的,内层循环就不会“循环”。并且因此不需要IF块:

public class MissingNumber {
    public static void main(String[] args) {
        int[] arr = {12, 13, 17, 18, 20, 21, 24, 25, 26};

        System.out.println("missing numbers");
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = arr[i] + 1; j < arr[i + 1]; j++) {
                System.out.println("" + j);
            }
        }
    }
}

输出量:

missing numbers
14
15
16
19
22
23

就是这样

xmq68pz9

xmq68pz92#

您可以使用List<Integer>来避免重复相同的计算。

static List<Integer> missingNumbers(int[] a) {
    List<Integer> missingNumbers = new ArrayList<>();
    for (int i = 1, length = a.length; i < length; ++i)
        if (a[i - 1] + 1 < a[i])
            for (int j = a[i - 1] + 1; j < a[i]; ++j)
                missingNumbers.add(j);
    return missingNumbers;
}

public static void main(String[] args) {
    int[] a = {12, 13, 17, 18, 20, 21, 24, 25, 26};
    List<Integer> missingNumbers = missingNumbers(a);
    if (missingNumbers.size() == 1)
        System.out.println("There is only one missing number:");
    else
        System.out.println("There are " + missingNumbers.size() + " missing numbers:");
    for (int n : missingNumbers)
        System.out.println(n);
}

输出:

There are 6 missing numbers:
14
15
16
19
22
23
rxztt3cl

rxztt3cl3#

int[] arr = { 12, 13, 17, 18, 20, 21, 24, 25, 26 };
System.out.println("Array Source:");
System.out.println(Arrays.toString(arr) + "\n");
System.out.println("Missing number(s):");
int nextNumber = arr[0] + 1;
for (int i = 1; i < arr.length; i++) {
    while (arr[i] > nextNumber) {
        System.out.println(nextNumber);
        nextNumber++;
    }
    nextNumber++;
}

要用从minmax的所有数字填充数组,您可以写入

int[] shouldBe = IntStream.range(min, max + 1).toArray();

在这种特殊情况下

int[] shouldBe = IntStream.range(arr[0], arr[arr.length - 1] + 1).toArray();

相关问题