我有一个正整数的数组.除了此数组中的一个元素之外的所有元素都没有重复.找到唯一元素的方法是使用XOR按位运算符,仅当元素之一为1时返回1,否则返回false.
以下是代码:
public class Bitter {
public static void main(String[] args) {
int[] deliveryIds = {34, 40, 2, 21, 50, 40, 34, 2, 50};
System.out.println(new Bitter().findUniqueDeliveryId(deliveryIds));
}
public int findUniqueDeliveryId(int[] deliveryIds) {
int uniqueDeliveryId = 0;
for(int i = 0; i < deliveryIds.length; i++) {
uniqueDeliveryId ^= deliveryIds[i];
}
return uniqueDeliveryId;
}
}
Run Code Online (Sandbox Code Playgroud)
在循环中,数组中的每个整数与从0开始的uniqueId进行异或.然后,0与34进行异或.结果然后与数组40中的下一个整数进行异或运算,我们将完成整个过程.阵列.
即使在设置断点并且一次遍历整个流程之后我仍然无法理解,如何使用uniqueId(从它的值0开始)进行异常可以帮助我们找到数组中的非重复整数?
不应该像40个XOR一样的数字(导致值0),以确认它是重复的.与此不同的是,我们与数组中的第一个整数进行异或,并且结果与数组中的后续数字相对应.我缺少什么/
我有以下代码使用位向量在字符串中查找唯一字符。我们假设它是仅包含小写字母的ASCII字符集。
我很难理解下面的位向量的用法。即使在通过程序调试并遵循更改之后,变量也会在每个循环之后通过。
// assuming that the characters range from a-z
static boolean isUniqueBitVector(String str) {
int checker = 0;
for(int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
if((checker & (1 << val)) > 0) {
return false;
} else {
checker |= (1 << val);
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
将val(字符串中每个字符的int表示形式)左移1,然后用checker(初始化为0)对其进行AND'运算,然后在else块中对其进行OR'运算的目的是什么。