一、交换
实现两变量a,b的交换,常用的方法为引入第三个变量temp,实例如下:
对一个一维int数组,常用方法为:
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
使用异或:
public static void swap_(int[] arr, int i, int j) {
//a = a ^ b; -> a = a ^ b
//b = a ^ b; -> b = a ^ b ^ b = a
//a = a ^ b; -> a = a ^ b ^ a = b
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
理论支撑:
a ^ b = b ^a; 交换律
a ^ b ^ c = a ^ (b ^ c); 结合律
0 ^ N = N;
N ^ N = 0;
使用异或进行交换的前提:两变量内存不同。
二、实例
- 给定整形数组,已知有且仅有一个值出现次数为奇数次,其他均为偶数次,返回该值。
public static int find_1(int[] nums) {
//[2, 2, 3, 1, 1, 5, 3, 6, 8, 6, 3, 8, 5] -> 3
int eor = 0;
for (int num : nums) {
eor ^= num;
}
return eor;
}
- 给定整形数组,已知有且仅有两个值出现次数为奇数次,其他均为偶数次,返回这两个值。
public static int[] find_2(int[] nums) {
//[2, 2, 3, 1, 1, 5, 3, 6, 5, 8, 6, 3, 8, 5] -> [3, 5]
int eor = 0;
int eor1 = 0;
for (int num : nums) {
eor ^= num;
}
int onePos = eor & (~eor + 1);
for (int num : nums) {
if (((num & onePos) == 0)) {
eor1 ^= num;
}
}
eor ^= eor1;
return new int[]{eor, eor1};
}