找到"失踪" Java数组中的整数

时间:2016-03-26 16:17:21

标签: java arrays numbers linear

给定长度为n的数组A [],找到"缺少"数字k使得:

  • k不在A
  • 0℃; = K< = N

我已经看到类似的问题,其中A []包含数字1到n,其中一个数字丢失,但在这个问题中,A []可以包含任何数字。我需要O(n)时间的解决方案。例如,

A = {1,2,3} -> 0
A = {0,1,2} -> 3
A = {2,7,4,1,6,0,5,-3} -> 3,8

我已经检查了数组中是否有0或n,如果没有,则返回0或n,但我似乎无法想到任何其他解决方案。考虑到A可以包含任何数字而不一定是数字1到n或类似的事实,这个问题似乎要困难得多。

5 个答案:

答案 0 :(得分:5)

线性迭代数组并“划掉”您遇到的每个数字。然后再次迭代所列出的划掉的数字,看看哪一个丢失了。

 public static int getMissingNumber(int[] A) 
 {  
    int n = A.length;  
    boolean[] numbersUsed = new boolean[n + 1]; //Because the definition says 0 <= k <= n, so k = n is also possible.

    for(int k = 0; k < n; k++) 
    {
        if(A[k] <= n && A[k] >= 0) //No negative numbers!
           numbersUsed[A[k]] = true;
    }

    for(int k = 0; k <= n; k++) 
    {
       if(numbersUsed[k] == false) 
          return k;
    } 
    return -1; //nothing found
 }   

由于两个for循环,复杂性为2 * n,因此总体复杂度为O(n)

答案 1 :(得分:1)

简单方法:

  • 使用您需要的所有值初始化一个集合。 (在您的情况下,编号为0到n)
  • 迭代你的arry并从集合中删除号码
  • 最后该集合为您提供了缺失的条目。

答案 2 :(得分:0)

如果您知道缺少一个数字,则可以使用xor。

进行简单的解决方案
static int missing(int[] arr) {
    int result = 0;
    for (int i = 0; i < arr.length; i++)
        result ^= (i + 1) ^ arr[i];
    return result;
}

如果可能缺少多个号码,您可以像这样返回Set

static Set<Integer> missing(int[] arr) {
    Set<Integer> set = new HashSet<>();
    for (int i = 0; i <= arr.length; i++)
        set.add(i);
    for (int a : arr)
        set.remove(a);
    return set;
}

答案 3 :(得分:0)

这里是一种利用一个循环的解决方案。那就是我们选择忽略Arrays.sort的作用

import java.util.Arrays;
class Solution {
    public int solution(int[] A) {
        Arrays.sort(A);     
        int min = 1; 

        for (int i = 0; i < A.length; i++){
            if(A[i]== min){
                min++;
            }
        }   
        min = ( min <= 0 ) ? 1:min;
        return min;    
    }
}

答案 4 :(得分:0)

class Missing{
public static void main(String[] args) {
int i;int result;
int a[]={1,2,4,5,6,7,9};

for(i=0;i<a.length-1;i++){
    if(a[i+1]-a[i]!=1){

        result=a[i]+1;

        System.out.print("missing element is:"+result);
    }
}
}
}

//output:missing element is:3
    // missing element is:8