[牛客]寻找奇数出现II练习题

来源:互联网 发布:最新挣钱软件 编辑:程序博客网 时间:2024/06/05 19:56

给定一个整型数组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;    }}


1 0