算法
- 交换位置
a^a=0
a^0=a
好处是不用开辟而外的空间,要注意的是i和j必须指向不同的内存空间,不然会被置为零
```go
func swap(arr []int, i, j int) {
arr[i] = arr[i] ^ arr[j]
arr[j] = arr[i] ^ arr[j] //这里等同于 arr[i] ^ arr[j]^ arr[j] 变成了arr[i]
arr[i] = arr[i] ^ arr[j] //等同于arr[i] ^ arr[j]^arr[i] 变成arr[j]
}
```
-
寻找不为偶数个的一种奇数
如{1,2,1,3,3,4,5,4,5,1,1},返回2func find(arr []int) { eor := 0 for _, a := range arr { eor ^= a //其它偶数个的都^成0 } fmt.Println(eor2) }
-
寻找不为偶数个的两种奇数
如{1,2,1,3,3,4,5,4,5,1,1,5},返回2,5arr := []int{1, 1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6} func find(arr []int) { eor := 0 for _, a := range arr { eor ^= a } eor1 := eor & (^eor + 1) //与上取反加一 得到最右边为1 eor2 := 0 for _, a := range arr { if eor1&a == 1 //取最右边为1的所有数,得到a or b 和其他数(这里其他数必定是偶数个可以消掉),全部异或得到a or b { eor2 ^= a } } fmt.Println(eor2, eor^eor2) //这里就是a^b^a,或者a^b^b 得到另一个 }
-
插入排序
{7, 1, 2, 6, 3, 4, 6, 2, 1}
先排7,1 得到{1,7, 2, 6, 3, 4, 6, 2, 1}
再排 172 得到{1,2,7 6, 3, 4, 6, 2, 1}
以此类推,类似摸扑克牌,往左边插入
最大复杂度O(n^2)func insert(arr []int) { //arr := []int{7, 1, 2, 6, 3, 4, 6, 2, 1} for i := 1; i < len(arr); i++ { for j := i - 1; j >= 0 && arr[j+1] < arr[j]; j-- { arr[j+1] = arr[j+1] ^ arr[j] arr[j] = arr[j+1] ^ arr[j] arr[j+1] = arr[j+1] ^ arr[j] } } fmt.Println(arr) }