【问题标题】:Get the missing digits of an array获取数组缺失的数字
【发布时间】:2013-08-22 11:50:26
【问题描述】:

我有一个包含数字的数组,并且该数组未排序。用户可以从数组中删除数字。但是用户以后应该可以添加数字。

基本上我想在数据库中写入 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。

请记住,用户可以关闭 程序,因此无法将数字保存其他数组

  • 感谢您的帮助

【问题讨论】:

  • 你的问题能更清楚一点吗?手段请举个例子。
  • 如果data 只包含整数,为什么它是Objects 的数组?
  • @AnthonyGrist 这只是最初的一个例子,我使用 Object,因为它是 JTabel 的数据
  • 你不能以某种方式对临时存储中的数据进行排序并找到第一个丢失的数字吗?
  • @nommyravian 是的,一开始还不错,但现在我如何获得排序数组的第一个缺失数字?它不是最大的,也不是最小的,所以我实际上不能使用 if or?

标签: java arrays if-statement for-loop


【解决方案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;
}

}

【讨论】:

  • 如果丢失了多个数字怎么办?
  • @Gerret 我以为您只需要一个,抱歉,但在这种情况下,您必须将删除时的号码保存到集合中
  • 所以基本上取回最大的数字并检查该数字是否在数组中。这是一个非常好的解决方案,可能不是最好的编码风格:D,但谢谢^^
  • 我现在使用了类似的答案,但基本上你的答案给了我这个想法
【解决方案2】:

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

    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.

【讨论】:

  • 请帮我解释一下if语句
  • If 语句将检查序列的连续性。即它使用 所谓的计数器 i 检查 data 的 1,2,4 值,该计数器在每个循环语句后递增,并在遇到缺少 3 时中断。
  • 是的,但是 i++ +1 是什么?
  • 是的,我对 java 并不陌生,但我还没有见过 xD
  • @Gerret 希望这对你有用,并且这个答案是正确的.. ;)
【解决方案3】:

一种方法是维护一个包含已删除号码的并行数组。

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

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

【讨论】:

  • 这实际上是不可能的,因为如果用户关闭程序,我会丢失数组的数据并且无法获取它。
【解决方案4】:

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

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

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

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

    通过二分查找,你可以找到一个被删除的洞(移位的数字)。

  3. 无序。保留删除的数量。 保留无限的BitSetdata.length 位。

    或者是带有删除的Set&lt;Integer&gt;。并在集合变得太大时重新编号。 (一组从-ID 到 to-ID 的范围会更好。)

【讨论】:

  • 我不明白你的代码,你可以让它更简单或向我解释一下吗?而且我无法重新编号 ID,因为这需要很长时间!目前我不使用多任务处理,所以用户必须等到所有数据库行都被编辑。
  • 如果你从 n 中删除 i,你可以将 n 复制到 i 并减少 n。可能也不合适。 也许你真的应该看看嵌入式数据库,比如 java Derby、HSQL 或其他什么。它也提供持久性和查询。
【解决方案5】:

如果你在临时存储中对 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 2012-10-15
    • 2019-05-28
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多