版权声明:本文为博主原创文章,转载请附上博文链接! 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)
}