java - 从java中的数组中找出n个缺失元素

标签 java arrays algorithm arraylist

我有一个数组,其中包含一些整数。比如,numbers={3,0,1}numbers={9,6,4,2,3,5,7,0,1}。现在我必须从数组中找出缺失的数字。按照这个例子,每组中只有一个缺失的数字。第一个错过 2,第二个错过 8。

我已经编码了。我的代码不仅可以从指定的集合中找出一个缺失的数字,还可以从给定的集合中找出超过 1 个缺失的数字。

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

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。那么我该如何进行呢。我是在使用列表还是仍然卡在数组中?

所以我尝试用数组列表创建它。

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 可以解决我的问题。但是有没有可能一个简单的数组就可以解决这个问题呢?

最佳答案

此代码使用HashSet:

public static void main(String[] args) {
    int[] numbers = {9, 6, 4, 5, 7, 0, 1};
    Arrays.sort(numbers);
    HashSet<Integer> set = new HashSet<>();

    for (int i = numbers[0]; i < numbers[numbers.length - 1]; i++) {
        set.add(i);
    }

    for (int i = 0; i < numbers.length; i++) {
        set.remove(numbers[i]);
    }

    for (int x : set) {
        System.out.print(x + " ");
    }
}

将打印:

2 3 8 


这是它的工作原理:
1. 将数组最小数到数组最大数的所有数加到集合中。
2. 遍历数组并从集合中移除数组的每一项。
3. 打印集合中剩余的项,即数组中所有缺失的项。

关于java - 从java中的数组中找出n个缺失元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823608/

相关文章:

java - 调整对话框大小时如何调整对话框内子项的大小

c++ - 如何使用二维矩形缓冲区沿二维线段限制搜索空间

algorithm - sagemaker 的线性学习器可以用于多类分类吗?

java - 在 BFS 中遍历时如何存储每个节点的级别?

java - Java中的对象克隆() : why does this assertion fail?

java - 如何让俄罗斯方 block 每秒下落(错误)

java - Java 的基本字符串帮助(这里是新手)

python - NumPy 数组的最小-最大规范化

javascript - 在键值对中如何打印出一个不为空的值 JavaScript

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?