Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何查找动态数组中添加或删除的最新元素_Java_Algorithm_Data Structures_Dynamic Arrays - Fatal编程技术网

Java 如何查找动态数组中添加或删除的最新元素

Java 如何查找动态数组中添加或删除的最新元素,java,algorithm,data-structures,dynamic-arrays,Java,Algorithm,Data Structures,Dynamic Arrays,我在循环中得到一个输入数组,其中包含按排序顺序排列的数字。在每一次迭代中,输入数组将被添加或删除,其中包含任意一个数字(输入数组中没有重复项)。范例 注意:我有一个解决方案,我可以使用一个映射或不同的数组,将输入数组复制到新数组中,然后从下一次迭代开始,我将迭代输入数组,并将输入数组的元素与新数组进行比较,新数组中不存在的元素就是添加的元素;在新数组中存在但在输入数组中不存在的是已删除的。我正在寻找一种在空间和时间方面具有最优化逻辑的更好方法。下面给出的是最简单的方法之一: import jav

我在循环中得到一个输入数组,其中包含按排序顺序排列的数字。在每一次迭代中,输入数组将被添加或删除,其中包含任意一个数字(输入数组中没有重复项)。范例


注意:我有一个解决方案,我可以使用一个映射或不同的数组,将输入数组复制到新数组中,然后从下一次迭代开始,我将迭代输入数组,并将输入数组的元素与新数组进行比较,新数组中不存在的元素就是添加的元素;在新数组中存在但在输入数组中不存在的是已删除的。我正在寻找一种在空间和时间方面具有最优化逻辑的更好方法。

下面给出的是最简单的方法之一:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int first[] = { 3, 4, 8, 19 };
        int second[] = { 3, 4, 5, 8, 19 };
        int diff = Arrays.stream(second).sum() - Arrays.stream(first).sum();
        System.out.println(Math.abs(diff) + (diff > 0 ? " added." : diff < 0 ? " deleted." : ""));
    }
}
演示:

5 added.
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] testArrs = { 
                { 3, 4, 8, 19 }, 
                { 3, 4, 5, 8, 19 }, 
                { 3, 4, 5, 8, 19, 40 }, 
                { 3, 5, 8, 19, 40 },
                { 1, 3, 5, 8, 19, 40 } };
        int i, diff = 0, lastSum = Arrays.stream(testArrs[0]).sum(), currentSum;

        for (i = 1; i < testArrs.length; i++) {
            currentSum = Arrays.stream(testArrs[i]).sum();
            diff = currentSum - lastSum;
            System.out.println(Math.abs(diff) + (diff > 0 ? " added." : diff < 0 ? " deleted." : ""));
            lastSum = currentSum;
        }
    }
}
5 added.
40 added.
4 deleted.
1 added.

以下是最简单的方法之一:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int first[] = { 3, 4, 8, 19 };
        int second[] = { 3, 4, 5, 8, 19 };
        int diff = Arrays.stream(second).sum() - Arrays.stream(first).sum();
        System.out.println(Math.abs(diff) + (diff > 0 ? " added." : diff < 0 ? " deleted." : ""));
    }
}
演示:

5 added.
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] testArrs = { 
                { 3, 4, 8, 19 }, 
                { 3, 4, 5, 8, 19 }, 
                { 3, 4, 5, 8, 19, 40 }, 
                { 3, 5, 8, 19, 40 },
                { 1, 3, 5, 8, 19, 40 } };
        int i, diff = 0, lastSum = Arrays.stream(testArrs[0]).sum(), currentSum;

        for (i = 1; i < testArrs.length; i++) {
            currentSum = Arrays.stream(testArrs[i]).sum();
            diff = currentSum - lastSum;
            System.out.println(Math.abs(diff) + (diff > 0 ? " added." : diff < 0 ? " deleted." : ""));
            lastSum = currentSum;
        }
    }
}
5 added.
40 added.
4 deleted.
1 added.


如果数组总是被排序的,并且输入只在一个地方更改,那么如果您在每次迭代中都可以访问旧数组和新数组,那么一个有效的算法可以使用二进制搜索在
O(logn)
时间中搜索数组之间的第一个不同元素。如果中间指向不同的元素,请查看左半部分;否则,在右边。

如果数组总是被排序,并且输入仅在一个位置发生变化,那么如果您在每次迭代中都可以访问旧数组和新数组,那么一个有效的算法可以使用二进制搜索在
O(logn)
时间中搜索数组之间的第一个不同元素。如果中间指向不同的元素,请查看左半部分;否则,在右侧。

是您自己添加到输入数组中,还是其他人添加到输入数组中?你的唯一工作是检测是否添加或删除了某些内容的更改吗?你能给我们分享你使用的最小可复制代码吗?@vivek_23:reactjs软件包在单击复选框时执行此操作。在每个复选框单击时,我都会以排序格式获取带有选中ID的输入数组。为了避免混淆,我刚刚优化了这个问题。变化最多是一个元素吗?@vivek_23:答案是无限的。但我会根据应用程序的性能将此数组限制为特定大小,因为我无法在客户端维护无限数组您自己或其他人添加到输入数组?你的唯一工作是检测是否添加或删除了某些内容的更改吗?你能给我们分享你使用的最小可复制代码吗?@vivek_23:reactjs软件包在单击复选框时执行此操作。在每个复选框单击时,我都会以排序格式获取带有选中ID的输入数组。为了避免混淆,我刚刚优化了这个问题。变化最多是一个元素吗?@vivek_23:答案是无限的。但我将根据应用程序的性能将此数组限制为特定大小,因为我无法在客户端维护无限数组。是的,如果我必须使用第二个/新数组,这是最佳解决方案。仍在寻找不必维护第二个阵列的解决方案。谢谢你的回答。在每次迭代中,我都会得到一个输入数组,其中包含排序后的值,我必须从中查找最新添加/删除的值。这意味着在给定的时间点,我只有一个数组。我要寻找的是不使用任何附加阵列的解决方案。我现在明白了吗?@ShreyaBhatnagar没有。如果没有存储关于某个事物的任何信息,
a
,从逻辑上讲,就不可能知道
a
和另一个事物,
B
之间的区别。是的,对于给定的输入数组,我会在每次迭代中存储一些信息,但不需要它的数据结构,变量应该足够了。是的,如果我必须使用第二个/新数组,这是最好的解决方案。仍在寻找不必维护第二个阵列的解决方案。谢谢你的回答。在每次迭代中,我都会得到一个输入数组,其中包含排序后的值,我必须从中查找最新添加/删除的值。这意味着在给定的时间点,我只有一个数组。我要寻找的是不使用任何附加阵列的解决方案。我现在明白了吗?@ShreyaBhatnagar没有。如果没有存储关于某个事物的任何信息,
a
,从逻辑上讲,就不可能知道
a
和另一个事物,
B
之间的区别。是的,对于给定的输入数组,我会在每次迭代中存储一些信息,但不需要它的数据结构,变量应该足够了。为了进行更多的优化,我们可以不使用第二个数组来完成吗?我的意思是在每次迭代中,当我得到输入数组时,我可以把它的和存储在一个变量中,然后用下一次迭代的输入数组的和减去它。如果最终答案是肯定的-添加,否则-删除(与您在代码中提供的相同)。@ShreyaBhatnagar-很好!我已经更新了答案以合并它。为了获得更多优化,我们可以不使用第二个数组来完成吗?我的意思是在每次迭代中,当我得到输入数组时,我可以把它的和存储在一个变量中,然后用下一次迭代的输入数组的和减去它。如果最终答案是肯定的-添加,否则-删除(与您在代码中提供的相同)。@ShreyaBhatnagar-很好!我已经更新了答案,将其纳入其中。