给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。
测试样例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]
1、右移运算符>>使指定值的所有位都右移规定的次数。右边移出去的部分扔掉不要,左边空出来的部分用原来的数字填充(这就是所谓的带符号右移)
——比如说5,右移后为00000010。
——假设x=-12,表示为32位int型就是
11111111111111111111111111110100
x>>3即带符号右移3位,结果是
11111111111111111111111111111101,化为十进制等于-3
2、>>>与>>唯一的不同是它无论原来的最左边是什么数,统统都用0填充。
——byte是8位的,-1表示为byte型是11111111(补码表示法)
b>>>4就是无符号右移4位,即00001111,这样结果就是15。
import java.util.*;
public class OddAppearance {
public int[] findOdds(int[] arr, int n) {
int e0 = 0 , e1 = 0;
for(int i = 0 ; i < n ; i++){
e0 = e0 ^ arr[i];
}
//e0 = a ^ b
int point = 1;
while(((e0>>point)&1) != 1) point++;
for(int i = 0 ; i < n ; i++){
if(((arr[i]>>point)&1) == 1)e1 = e1 ^ arr[i];
}
int e2 = e0 ^ e1;
int[] result = {Math.min(e1,e2),Math.max(e1,e2)};
return result;
}
}