1.异或运算
★异或交换
arr[i] = arr[i] ^arr[j]
arr[j] = arr[i] ^arr[j]
arr[i] = arr[i] ^arr[j]
原理:
a^0=a a^a=0
异或运算满足结合律和交换律,故
arr[i] = arr[i] ^arr[j] arr[i]=arr[i] ^arr[j] arr[j] = arr[j]
arr[j] = arr[i] ^arr[j] arr[i] =arr[i] ^arr[j] arr[j] = arr[i] ^(arr[j] ^ arr[j]) = arr[i]^0=arr[i]
arr[i] = arr[i] ^arr[j] arr[i] = arr[i] ^arr[j]^arr[i] = arr[j] arr[j] = arr[j]
交换成功!
例题使用:
可利用异或运算的性质:
思路 对数值进行遍历异或运算,当元素出现为偶次时,如int res = a ^ a = 0;
而当元素出现为奇数次时,int res = a ^ a ^ a = a;
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int num : nums){
res = res ^ num;
}
return res;
}
}
先将原码变为补码,在与源码相与
int rightOne = eor & (~eor + 1)
获取位运算中一个不等于零的数最右边的1
在使用取中间值(下标)时,往往会采用第一种方式(mid = (l + r)/2),但这样计算时 l +r 会导致整型溢出而变成负数的情况
故我们可以使用①mid = l + (r - l)/2 或②l + (r - l) >> 1来进行求中间值
小堆顶在Java中可直接使用优先队列
但要记住:Java给我们的只是一个黑盒,我们使用它将很难改变其中的结构,所以我们有时候需要手写堆来进行算法操作