位运算
位运算
位运算巧用,能起到事半功倍的效果
以下问题可借助哈希表解决,但用位运算更巧妙
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。
找出那个只出现了一次的元素。
func singleNumber(nums []int) int {
result := 0
for _, v := range nums {
result ^= v
}
return result
}
137. 只出现一次的数字 II
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。
找出那个只出现了一次的元素。
func singleNumber(nums []int) int {
result := 0
for i := uint(0); i < 64; i++ {
ones := 0 // 统计第i位1出现的个数
for _, v := range nums {
ones += (v >> i) & 1
}
result |= (ones%3) << i
}
return result
}
260. 只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
func singleNumber(nums []int) []int {
t := 0
for _, v := range nums {
t ^= v
}
// 最后一个1的位置, 或写作 t & (-t)
// 假设要求的两个数分别是x和y,最后一个1,要吗来自x,要吗来自y
diff := (t & (t - 1)) ^ t
x := 0
for _, v := range nums {
if diff&v != 0 {
x ^= v
}
}
return []int{x, t ^ x}
}