在Java中查找数组中n个缺失元素

13

我有一个数组,其中存储了一些整数。比如说:numbers={3,0,1}或者numbers={9,6,4,2,3,5,7,0,1}。现在我要找出数组中缺失的数字。以这个例子为例,每组中只有一个缺失的数字。第一个数组缺失2,第二个数组缺失8。

我已经编写了代码。我的代码不仅可以从指定的数组中找到一个缺失的数字,还可以找到多个缺失的数字。

但是,如果同一个数组中有连续两个缺失的数字,它就无法找到

My code
import java.util.Arrays;

public class Missing_number 
{
    public static void main( String args[] )
    {
        int numbers[]={9,6,4,5,7,0,1};
        Arrays.sort(numbers);
        int i=1;

        while ( i < numbers.length ) 
        {
            if ( numbers[i] - numbers[i-1] == 1 ) 
            {
            } 
            else 
            {
                System.out.println( "Missing number is " + ( numbers[i-1] + 1 ) );
            }
            i++;
        }
    }
}

我在思考,如果我能将数组中第一个缺失的数字添加进去,然后开始搜索,那么代码会是什么样子呢?numbers={9,6,4,5,7,0,1}。现在,8已经从这个集合中缺失了。现在我已经终止了列表中的两个元素(2,3)。输出:根据我的代码:2,8,但是3也缺失了,但没有显示。

我在想,如果我能在数字数组中附加2,那可能会更容易一些。但我们都知道Java数组是不可变的,所以我们不能增加它的长度。

因此,也许我会使用List。 但在列表中,这种类型的索引 number[0]=something 不被支持。 那么我该如何继续呢? 我正在使用列表还是仍然卡在数组中?

因此,我尝试用一个ArrayList来创建它。

Mycode(modified version from array)

 public class T1 {
 public static void main(String args[]){
    List<Integer> numbers=new ArrayList<>();
    numbers.add(9);
    numbers.add(6);
    numbers.add(4);
    numbers.add(5);
    numbers.add(7);
    numbers.add(0);
    numbers.add(1);
    Collections.sort(numbers);
    int i=1;
    while(i< numbers.size()) {
        if (numbers.get(i) - numbers.get(i-1) == 1) {

        } else {
            System.out.println("Missing number is " + (numbers.get(i-1) + 1));
            numbers.add((numbers.get(i-1)+1));
            Collections.sort(numbers);
        }
        i++;
    }

    }
}

ArrayList可以解决我的问题。但是是否有可能用一个简单的数组解决这个问题呢?


但是 ArrayList 支持索引,对吧? - Kingsley
1
使用列表时,您可以使用get(int)方法而不是下标,将索引作为方法参数。 - Ted Hopp
不过众所周知,Java数组是不可变的 - 不,Java数组是可变的。它们不可调整大小,但它们是可变的。 - user2357112
11个回答

-1

我不知道这是否能帮到你,但是使用awk也可以完成相同的操作。

echo "13 2 5 9 4" | xargs | tr " " "\n" | sort -n | awk 'BEGIN { i=1}; {if (i!=$NF) {for(j=i;j<=$NF;j++) {if(j!=$NF) print j; i++}} else i++}'

1 3 6 7 8 10 11 12

在这里,数组中最大的数字被视为序列的限制,awk将每个数字与整数序列匹配,如果不匹配,则简单地打印数字。


1
该问题有一个java标签,这意味着答案应该用Java给出。参考如何处理与OP请求的编程语言不同的答案?,在某些特定情况下,用不同于所要求的编程语言回答可能是可以接受(有帮助的),但通常情况下这样做并不那么有帮助。此外,在回答旧问题时,确保您的答案添加了新内容或在其他方面有所帮助。 - Ivo Mori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接