如果有一天刷题不火了,还会再刷题吗?如果没有再爱好刷题的人了,你还会再刷题吗?
一、问题描述
有一个数组,其中两个数出现一次,其它都出现两次
1 public class TwoNumAppearOnce { 2 /* 3 1 1 1 1 1 1 1 1 4 0 0 0 0 0 0 0 1 5 0 1 0 0 0 0 0 0 6 1 0 1 0 1 0 1 0 7 1 1 1 1 1 1 1 1 8 0 1 0 0 0 0 0 0 9 思路: 10 1、两个数不一样,因此它俩有一位不相同 11 2、其它的数都是偶数个 12 3、因此可以根据不同位将数分为两部分,一部分是该不同位都为0,另一部分是不同位都位1。 13 4、分为两部分后再把所有数求异或就可以了 14 */ 15 16 17 public int[] numsAppearOnce(int[] nums) { 18 int[] res = new int[2]; 19 int diff = 0; 20 for (int n : nums) 21 diff ^= n; 22 23 int fn = fpoba(diff); 24 for (int n : nums) { 25 if ((n >>> fn) == 0) 26 res[0] ^= n; 27 else 28 res[1] ^= n; 29 } 30 return res; 31 } 32 33 // first position one bit appears 34 private int fpoba(int num) { 35 int res = 0; 36 while ((num & 1) != 1) { 37 num = (num >>> 1); 38 res++; 39 } 40 return res; 41 } 42 }