//查找一堆出现次数为偶数中的唯一的奇数次数
func findOddNum(nums []int) int {
var res int = 0
for i := 0; i < len(nums); i++ {
res ^= nums[i]
}
return res
}
//查找一堆出现次数为偶数次数中唯二的两个奇数次数
/*
1. 首先将所有数异或得到这两个奇数的异或ans
2. 找到ans的一个为1的位置,设这位为1其余为0的二进制为s
3. 标记两个数res1与res2,将s与所有数相与,若为1,与res1异或,否则与res2异或
4. res1,res2为返回值
ans某一位为1,证明这一位两个奇数次数不相同
而因此可以通过这一位是否为1将数据分为两类,一类为奇数res1 + 一堆这一位为1的偶数次数,另一类....
*/
func findOddTowNum(nums []int) (int, int) {
ans := findOddNum(nums)
s := 1
for i := 0; i < 32; i++ {
if ans & s != 0 {
break
}
s <<= 1
}
res1, res2 := 0, 0
for i := 0; i < len(nums); i++ {
if s & nums[i] != 0 {
res1 ^= nums[i]
} else {
res2 ^= nums[i]
}
}
return res1, res2
}
func main() {
buf := bufio.NewReader(os.Stdin)
s, _, _ := buf.ReadLine()
strs := strings.Fields(string(s))
var nums []int
for i := 0; i < len(strs); i++ {
n, _ := strconv.Atoi(strs[i])
nums = append(nums, n)
}
fmt.Println(findOddNum(nums))
fmt.Println(findOddTowNum(nums))
}
算法-查找一堆出现次数为偶数次数中唯二的两个奇数次数
最新推荐文章于 2024-07-25 13:03:12 发布