题解 | 数组中值出现了一次的数字

数组中值出现了一次的数字

https://www.nowcoder.com/practice/200d8d789f9f431999fac795bb094356

package main

import (
	"fmt"
)

func main() {
	num := 0
	for {
		n, _ := fmt.Scan(&num)
		if n == 0 {
			break
		} else {
			arr := make([]int, num)
			for i := 0; i < len(arr); i++ {
				fmt.Scan(&arr[i])
			}
			s, b := process(arr)
			fmt.Println(s, b)
		}
	}
}

// 异或操作,相同为0,不同为1
// 0^n = n
// 0^1 = 1, 0^0 = 0, 1^1=0
func process(arr []int) (int, int) {
	// 其它数出现偶次,其它数自己和自己xor=0
	// 剩下的数位,有2个不同的数各只出现一次,假设为a,b
	xor := 0
	for i := 0; i < len(arr); i++ {
		xor ^= arr[i]
	}
	// xor = a^b
	// 取出xor中,最右边第一个不为0的数last1
	// 如假设xor=100100, last1=100
	// arr中所有的数,该为第一个不为0的数进行异或操作
	// 异或的结果值为xoraorb就等于 a 或者 b
	last1 := (^xor + 1) & xor
	// 此时数组可以分割为2个组别
	// 包含a的一组,包含b的一组
	xorab := 0
	for i := 0; i < len(arr); i++ {
        // 这里不能写 == 1,
        // 不一定为最后一个1
		if last1 & arr[i] == last1 {
			xorab ^= arr[i]
		}
	}
	small := xorab
	big := xorab ^ xor
	if small > big {
		small, big = big, small
	}
	return small, big

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务