leetcode刷题笔记 260题 只出现一次的数字 III
问题描述:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
/*
对于可重复出现2次或偶数次的数,需要考虑到异或方法
由于本题存在两个只出现一次的数,因此对全部数异或的话,最终结果为两个只出现一次的数的异或
由于这两个数不相同,其二进制表达至少存在一位不同
对ab异或结果逐位与1取,获取区别位
而后对整个nums总右移K位(即区别位)与1取或值为0 或为1的所有数进行异或,最终结果可以分别得到两个只出现一次的数
*/
object Solution {
def singleNumber(nums: Array[Int]): Array[Int] = {
var ab = 0
for (num <- nums) {
ab ^= num
}
var k = 0
while ((ab >> k & 1) == 0) k += 1
def get(nums: Array[Int], k: Int, t: Int): Int = {
var res = 0
for (num <- nums) {
if ((num >> k & 1) == t){
res ^= num
}
}
return res
}
return Array(get(nums, k, 0), get(nums, k, 1))
}
}