繁体   English   中英

查找已排序数组中唯一的重复元素

[英]Finding the only repeating element in sorted array

我知道在排序数组中找到非重复元素的XOR技巧(之前已经被问过):

public int singleNumber(int[] nums) {
    int result = 0; 
    for (int i = 0; i < nums.length; i++) {
        result = result ^ nums[i]; 
    }
    return result; 
}

但是,我们如何使用相同的逻辑来做相反的事情呢?

更具体地说:考虑一个排序数组,其中每个元素只出现一次, 我们如何找到在O(1)空间中重复的一个元素?

如果你想丢弃数次的重复,那么XOR技巧只是整洁。 查看它的一种方法是说数组的所有元素的xor是该数组的奇怪重复元素的xor ; 所以,如果只有一个奇怪的重复元素,你可以通过这种方式找到它。 并且您根本不需要对数组进行排序:

// could also have called it xorOfOddlyRepeatingIntsInArray(int[] a)
public static int findSingleNonEvenlyRepetingIntInUnsortedArray(int[] a) {
  int x = 0;
  for (int i: a) x ^= i;
  return x;
}

根据您的要求,这两个片段在O(1)空间和O(n)时间内的排序数组中找到repeat元素:

public static int findSingleRepeatingIntInSortedArray1(int[] a) {
  for (int i=0; i<a.length-1; i++) if (a[i] == a[i+1]) return a[i];
  return -1;
}

public static int findSingleRepeatingIntInSortedArray2(int[] a) {
  for (int i=0; i<a.length-1; i++) if ((a[i] ^ a[i+1]) == 0) return a[i];
  return -1;
}

但你应该更喜欢版本1,因为a[i] == a[i+1](a[i] ^ a[i+1]) == 0(a[i] - a[i+1]) == 0 (a[i] ^ a[i+1]) == 0更具可读性(a[i] - a[i+1]) == 0 ,或(a[i] & a[i+1]) == a[i]或其他神秘变体来检查是否相等。 在这种情况下,Xor没有给你买任何东西

对于笑声和咯咯笑声,此代码在未排序的数组中找到O(1) 空间中的单个重复值:

 public static int findSingleRepeatingIntInSortedArray3(int[] a) {
    for (int i=0; i<a.length; i++) {
       for (int j=i+1; j<a.length; j++) {
          if (a[i] == a[j]) return a[i];
       }
    }
    return 0;
 }

是的,它是O(n ^ 2) 时间 ,并且有更快的方法来找到第一个重复元素(想到排序) - 但它是问题的有效答案。

我想有人删除了使用XOR的评论。 这里是:

    private int returnNumber(int[] nums) {
    int result = 0;
    for (int i = 1; i < nums.length; i++) {
        if ((nums[i] ^ nums[i - 1]) == 0) {
            result = nums[i];
            break;
        }
    }
    return result;
}

我真的不确定这是否使用O(1)。

我没有找到一个基于XOR的解决方案,但这个令人惊讶的简单解决方案可以实现这一技巧。

public static int getRepeatingValue(int[] nums) {
    for (int i = 1; i < nums.length; i++) {
        if (nums[i] == nums[i - 1]) {
            return nums[i]; 
        }
    }
    return -1; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM