转载自:https://blog.csdn.net/hulamua/article/details/52411446
1.交换
交换a和b的简单写法
-
a ^= b;
-
b ^= a;
-
a ^= b;
2.一个整形数组,存1到n的所有整数,但缺省一个值,找出此值。
先求1到n的异或,再和数组中所有数异或,结果就是要找的值。
3.一个整形数组除一个数只出现一次外,其余的都出现2次,求这个数
数组中所有值进行异或即可。
4.一个整形数组除两个数只出现一次外,其余的都出现2次,求这两个数。
若求所有数的异或,得出的是那两个数的异或值,这样没法分出两数。
有两种方法:(1)不同的两个数进行异或,肯定有至少1位为1。比如,这两个数的二进制为1101和0001,异或结果为1100。那么找出这个1,就可以把整个数组分为两部分,再利用2中的方法一一找出。
<pre name="code" class="java">public static void findTwoNumber(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum = sum ^ a[i];
}
int bit = 1; // 从最低位,即0001开始找
while (true) {
if ((sum & bit) != 0)
{
break; // 通过与bit相与,找出异或后为1的那一位
}
else
{
bit = (bit<<1);
}
}
int re1 = 0;
int re2 = 0;
for (int i = 0; i < a.length; i++) {
if ((bit & a[i]) != 0) { // 利用与bit相与是否为0将数组分成两部分
re1 ^= a[i];
} else {
re2 ^= a[i];
}
}
System.out.println(re1 + " " + re2);
}
(2)将所有数异或,得出的值为a^b,再一一和数组中的值进行异或,得出的每个值存入一个list,由于两个数之外的值出现两次,判断数组中若已存在此值,将其删掉,最后list中就只有两个值,即为a与b
public static void findTwoNumber(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum = sum ^ a[i];
}
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++) {
int u = sum ^ a[i];
if (list.contains(u)) {
list.remove(Integer.valueOf(u));
} else {
list.add(u);
}
}
System.out.println((list.get(0)) + " " + (list.get(1)));
}
5.一个整形数组除3个数只出现一次外,其余的都出现2次,求这3个数。
将所有数异或,得出的值sum为a^b^c,再一一和数组中的值进行异或,得出的每个值存入一个list。将出现两次的值删掉,最后list中就只有三个值:a^b,a^c,b^c,三值与sum异或,即得c,b,a三个数。同理可求4个或更多出现一次的数。
public static void findThreeNumber(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum = sum ^ a[i];
}
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++) {
int u = sum ^ a[i];
if (list.contains(u)) {
list.remove(Integer.valueOf(u));
} else {
list.add(u);
}
}
System.out.println((sum ^ list.get(0)) + " " + (sum ^ list.get(1)) + " " + (sum ^ list.get(2)));
}
6.Leetcode389.Find the Difference
String s 和 String t仅含小写字母字符,其中t是s的重排且加了一个字符,找到那个新加入的字符。题意示例:
Input: s = "abcd" t = "abcde" Output: e
对s和t的每个字符异或。
public static char findTheDifference(String s, String t) {
char a = 0;
for (int i = 0; i < s.length(); i++) {
a ^= s.charAt(i); // 异或
}
for (int i = 0; i < t.length(); i++) {
a ^= t.charAt(i);
}
return a;
}