![](/img/trans.png)
[英]Finding the first element that starts with a specified String in a sorted String array in Java
[英]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.