[算法]位运算问题之二
题目一: 给定一个整形数组arr和一个大于1的整数k。已知arr中只有1个数出现了奇数次,其他的数都出现了偶数次,请返回出现了奇数次的数。 时间复杂度为O(N),额外空间复杂度为O(1)。 思路: 整数n与0异或的结果是n,整数n与整数n异或的结果是0.所以先申请一个整形变量,记为eO。把eO和每个数异或(eO=eO^当前数),最后eO的值就是出现了奇数次的那个数。 异或运算满足交换律和结合律。 public static void printOddTimesNum1(int[] arr) { int eO = 0; for (int cur : arr) { eO ^= cur; } System.out.println(eO); } 题目二: 给定一个整形数组arr,有两个数出现了奇数次,其他数都出现了偶数次。打印这两个数。 思路: 如果只有a和b出现了奇数次,那么最后的异或结果eO一定是a^b。所以,如果数组中有两个出现了奇数次的数,最终的结果eO一定不为0.那么肯定能在32位整数eO上找到一个不等于0的bit位,假设是第K为不等于0。eO在第K位上不等于0,说明a和b的第k位肯定有一个是1另一个是0.接下来再设置一个变量记为eHasOne,然后再遍历一次数组。在这次遍历中,eHasOne只与第k位上是1的整数异或,其他的数被忽略。那么在第二次遍历结束后