Java 检测未排序数组中的公共元素

Java 检测未排序数组中的公共元素,java,arrays,algorithm,Java,Arrays,Algorithm,我发现了一个可以检测未排序数组中的公共元素的代码。程序以线性时间运行!但我不明白这个计划的逻辑。如果有人能解释一下程序的逻辑,那将非常有帮助 代码如下: public class DeleteUnsortedDataFromArray { public static List<Integer> findDuplicatesArray(int[] sequence){ int bitarray = 0; for(int i=0; i<

我发现了一个可以检测未排序数组中的公共元素的代码。程序以线性时间运行!但我不明白这个计划的逻辑。如果有人能解释一下程序的逻辑,那将非常有帮助

代码如下:

public class DeleteUnsortedDataFromArray {

    public static List<Integer> findDuplicatesArray(int[] sequence){
        int bitarray = 0;

        for(int i=0; i< sequence.length; i++){
            int x = 1;
            x = x << sequence[i];

            if((bitarray & x) != 0){
                System.out.println("Duplicate found in given array: " + sequence[i]);
            } else {
                bitarray = bitarray | x;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        int[] input = {1,1,2,3};
        findDuplicatesArray(input);
    }

}
公共类DeleteUnsortedDataFromArray{
公共静态列表findDuplicatesArray(int[]序列){
int位数组=0;
for(int i=0;ix=x它所做的是将每个找到的值表示为构成整数(位数组)的位位置中的1

台词:

x = 1;
x = x << sequence[i];
使用位运算和检查位置是否已被占用,从而找到值

问题是,此算法仅在序列中的值被限制为低值时有效:在0和30之间,因为在一个数组中有32位,并且值0在位数组的位置0处表示为1


你也应该考虑当序列值为负时会发生什么。

< p>它只在数组中的所有值都适用时才起作用。[0,以int表示的位数)。当然,如果你可以对一个应该返回重复列表但总是返回null的函数说“works”。

你可以将该算法理解为使用布尔数组来测试数组中以前是否出现过值。现在,你不用布尔数组,而是使用s使用int中的位表示某个值以前是否出现过。该代码调用此“位数组”

要设置int中的第i位,请使用

x = (x | (1<< i));

x=(x |)(1这只是我还是缺少一个返回语句?@Jonn我想只有你。但是它返回的并不完全是你useful@Varun用
[0,32,64]试试看
作为输入。但是,如果数组包含以常数C为边界的整数,则可以在线性时间内找到重复的元素。如果输入数组为[0,32,64],只需使用大小为C的位集。@NiklasB.Nice catch代码爆炸!你知道如何解决这个问题吗?我删除了我的评论。我只希望看到至少一个答案提到,即使m不是常数,你仍然可以实现O(n+m)运行时。你甚至可以使用哈希表获得与m无关的线性预期时间
x = (x | (1<< i));
if((x & (1<< i)) != 0){

}