题目描述
比 leetcode 136要难点 注意:空间复杂度要求O(1),否则用哈希表直接秒杀啦。 昨天的笔试,还有刷的面经都有这道题。。。今天赶紧补补
思路 & 代码
相对于 leetcode 136,这边多了个分组的考点,相当于分成两个 leetcode 136 如何分组?用整组异或结果,找到第一个 1 位作为location(也就是两个答案的第一个不同位) 以这个location作为标准,把数组分成两个子数组(此位为1的数,此为为0的数) 可证 :两个子数组,一定都满足“数组中有一个数出现了一次,其他数都出现了两次”证明:首先location本就是把两答案区分开的,那么如何证明子数组中的其他数都是成对的呢?这个简单,就是因为原数组本就是成对的,用location作为标准,也是把元素成对区分到子数组中。
class Solution { public int [ ] singleNumbers ( int [ ] nums) { int XOR = 0 ; for ( int i : nums) { XOR ^= i; } int location = 1 ; while ( ( XOR & location) == 0 ) { location <<= 1 ; } int ans1 = 0 ; int ans2 = 0 ; for ( int i : nums) { if ( ( i & location) != 0 ) { ans1 ^= i; } else { ans2 ^= i; } } return new int [ ] { ans1, ans2} ; }
}
class Solution { public int [ ] singleNumbers ( int [ ] nums) { int xor = 0 ; for ( int temp : nums) { xor ^= temp; } int firstOne = 1 ; while ( ( xor & firstOne) == 0 ) { firstOne <<= 1 ; } int ans1 = 0 , ans2 = 0 ; for ( int temp : nums) { if ( ( temp & firstOne) == 0 ) { ans1 ^= temp; } else { ans2 ^= temp; } } return new int [ ] { ans1, ans2} ; }
}