获取数组的缺失数字

时间:2013-08-22 11:50:26

标签: java arrays if-statement for-loop

我有一个数字数组,该数组未排序。用户可以从阵列中删除数字。但是用户应该可以稍后添加数字。

基本上我想在数据库中写入id。用户可以删除,但如果他添加了一行,则 ID应该是已删除行中缺少的数字

目前我解决了这个问题:

for (Object[] object : data) {
    if ((int) object[1] > id) {
        id = (int) object[1];
    }
}

但有了这个,我只得到最大的数字,而不是丢失的数字。我怎么能得到一个丢失的号码?

示例:

  

4,2,3,1用户删除第2行和第4行,所以我有

     

3,1现在我想要计算或使用if语句获取2,如果用户添加另一行,则返回4。

请注意,用户可以关闭 程序,因此无法保存 其他阵列

  • 谢谢你的帮助

5 个答案:

答案 0 :(得分:1)

从您的示例中,将数字从开头到结尾相加,1 + 2 + 3 + 4 = 10并减去所有数字的总和,1 + 2 + 4 = 7

所以10 - 7 = 3(缺失的数字)

----------------------------------------------- -----编辑---------------- 怎么样?

public class SandBox7 {
public static void main(String[] args) {
    Integer[] array = new Integer[] { 1, 4, 9 };
    SandBox7 s = new SandBox7();
    List<Integer> mis = s.getMissingNumbers(array);
}

public List<Integer> getMissingNumbers(Integer[] in) {
    int max = getMaximum(in);
    // System.out.println(max);
    List<Integer> numbers = Arrays.asList(in);

    ArrayList<Integer> missing = new ArrayList<>();
    for (int i = 1; i < max; i++) {

        if (!numbers.contains(i)) {
            missing.add(i);
        }
    }
    return missing;
}

private int getMaximum(Integer[] in) {
    int tmp = -1;
    for (int i = 0; i < in.length; i++) {
        if (tmp < in[i])
            tmp = in[i];
    }
    return tmp;
}

}

答案 1 :(得分:1)

请看下面的代码..可能会有所帮助

    int data[]={1,2,4};
    int i=1;
    for(Object object : data){
        if((Integer)object!=i++)
            break;
    }
    System.out.println(i-1);//This will print 3.

答案 2 :(得分:0)

一种方法可能是维护一个包含已删除数字的并行数组。

Object[] data = ...;
Object[] delData = ...;

因此,每次插入/添加新数字时,都需要检查该数字是否存在于并行数组中。

答案 3 :(得分:0)

你有一些可能性,这是一个设计问题必须自己决定。只是一些替代方案:

  1. 最佳:删除时重新编号ID,但需要有关引用外键的元信息。

  2. 如果按ID排序数据。 未重新编号时的删除次数:

    int deletions = data.length
                    - (data.length == 0 ? 0 : data[data.length - 1][1]);
    

    使用二分搜索,您可以找到删除的孔(移位的数字)。

  3. 无序。保留删除的数量。 保持BitSet位的无限data.length

    或者是带有删除的Set<Integer>。当集合变得太大时重新编号。 (一组范围从-ID到ID也会更好。)

答案 4 :(得分:0)

如果你在临时存储中对id进行排序,那么找到第一个缺失的数字会很简单;

int arr[] = {0,1,2,5}; //think you've the sorted array now
int missing = arr.length; //would have the last id+1 if there is no missing id
for (int i = 0; i < arr.length; i++) {
    if (i != arr[i]) {
         missing = i;
         break;
    }
}
System.out.println(missing); //3 will be printed.