1.无序数组的二分应用
无序数组,相邻不等,找出一个局部最小。可用二分。
思路:
- 首先判定两端是不是比其相邻的小,如果是直接返回局部最小的位置。
- 否则,说明中间必定存在局部最小。选取两者的middle,判断middle是都是局部最小,如果是返回middle。
- 否则,根据趋势重复步骤二。
2.异或运算
基本概念
异或:相同为0,不同为1。
同或:相同为1,不同为0。
异或的基本性质
- 0^N == N, N^N == 0
- 异或运算满足交换律和结合律
运用举例
- 1.不增加额外变量,互换两个值,a = a^b;b = a^b;a = a^b
- 2.一个数组中有一种数字出现了奇数次,其他数字都出现了偶数次,怎么找到并打印这个数。int result = a[0
]a[1]...a[n]. - 3.怎么把一个int类型的数字N,提取出最右侧的1来。N&((~N)+1)
- 4.一个数组中有两种数字出现了奇数次,其它数都出现了偶数次,怎么找到并打印这两种数字。
运用结论3。
(a) 首先将所有数字进行异或,得出结果eor,这个结果等于这两个数字异或的结果。
(b) 接着将数组中的数字根据这个异或结果进行分组,两组中分别找出数字。具体操作为,(i)提取eor中最右侧的1,rightone(ii)如果arr[i]&rightone!=0,满足条件的进行异或,最终得到结果onlyone(iii)另一个结果为eor^onlyone - 某个数字二进制中1的个数。每次提取最右侧的1,再将最右侧的1给抹零,比如数字N的二进制中1的个数
int count = 0;
while(N!=0){int right = N&((~N) +1);count++;N = N^right}