golang_算法: leetcode_数组05-只出现一次的数字

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87924894
//设计算法:
//1.
//1) 设置map[int]bool,默认的bool是false

//注意有2种键值对,要分清:
//nums是数组,遍历中的键值对结构是0-值1,1-值2...
//m是一个map,对应的是值1-true,值2-false...

//2)进行判断所有值的全改成true,如果再遇到相同的v时,会执行m[v]==true的语句,m[v]会变为false

func singleNumber(nums []int) int {
	m := make(map[int]bool)
	for _, v := range nums {
		if m[v] == true {
			m[v] = false
		}else{
			m[v] = true
		}
	}
	//无重复值的数,m中的值为true
	var k int
	for k, v := range m{
		if v == true {
			fmt.Println("k:",k)
		}
	}
	return k
}

//2.利用map中的delete删除map中的键值对
func singleNumber2(nums []int) int {
	m := make(map[int]struct{})
	for _, v := range nums {
		_, ok := m[v]
		if ok {
			delete(m,v)
		}else{
			m[v] = struct{}{}  //给定一个值,构成hashmap键值对结构
		}
	}

	for k := range m{ //取hashmap中的键,键即我们所要的数
		fmt.Println(k)
		return k
	}
	return 0 //防止报错,给一个值
}

//3.利用0与数组中的值进行"异或"操作
//如果,数组中的值出现2次,2次异或后的结果为原来的数
func singleNumber3(nums []int) int{
	ret := 0
	for _, num := range nums {
		ret ^= num //ret = ret ^ num
		// 不是取幂,是异或操作,转化为2进制:相同为0,不同为1
		fmt.Println(ret)
	}
	fmt.Println(ret)
	return ret
}

func main() {
	nums := []int{2,1,1,4,4}
	singleNumber3(nums)
}

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87924894