判断奇偶数
通用做法:
if n % 2 == 1 {
// n 是个奇数
}
可以使用:
if n & 1 == 1 {
// n 是个奇数
}
交换两个数
temp := x
x = y
y = temp
// 不使用额外的辅助变量完成交换
x = x ^ y // (1)
y = x ^ y // (2)
x = x ^ y // (3)
推导:
对于(2),y = x^y = (xy)y = x(yy) = x^0 = x。 x 的值成功赋给了 y。
对于(3),x = x^y = (xy)x = (xx)y = 0^y = y。
两个相同的数异或之后结果会等于 0,即 n ^ n = 0。并且任何数与 0 异或等于它本身,即 n ^ 0 = n。
异或运算支持运算的交换律和结合律
找出没有重复的数
给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数 。
-
每次存储的时候,记录 某个数出现的次数,最后再遍历哈希表,看看哪个数只出现了一次。这种方法的时间复杂度为 O(n),空间复杂度也为 O(n)了。
-
把这些数全部异或一下,出现了两次的数异或之后会变成0,那个出现一次的数,和 0 异或之后就等于它本身。
func find(arr []int) int {
tmp := arr[0]
for (i := 1; i< len(arr), i++){
tmp = tmp ^ arr[i]
}
return tmp
}
时间复杂度为 O(n),空间复杂度为 O(1)
2的n次方
找出不大于N的最大的2的幂指数
时间复杂度是 O(logn)
int findN(int N){
int sum = 1;
while(true){
if(sum * 2 > N){
return sum;
}
sum = sum * 2;
}
}
参考:
- https://mp.weixin.qq.com/s/H5LIRjCVzlMKy-RrfKbFmA