1.1. 题目

1.1.1. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4



1.1.2. 题解:

  • 除了一个数是单独一次之外,其他的数最多只会出现两次
  • 数字的顺序不一定

1.1.3. 思路:

  • 按照说明的要求,我并没有做出来,因为我还是用了 map 存了一下数据,还是使用了额外的空间, 就是把数字出现的次数放入到map里,key是数字,value是出现的次数
  • 另外,如果可以存map,而且数字最多只会出现两次,所以 如果该数字出现了两次,其实就可以把这个数字给删了,这样map最后只会有一个值,就是单独出现的那个,这样减少查询次数了
  • 看了官方题解,发现最优解就是 数学方法的 异或 了! 大学的离散数学里的基本知识点都忘光咯..
  • a ⊕ b ⊕ a = (a ⊕ a) ⊕ b,所以直接把所以的数 进行异或 就可以得到结果了

1.1.4. 代码:

点击显示
 func singleNumber(nums []int) int {

     numLen := len(nums)
     var res int
     for i:=0;i<numLen;i++ {
         res = res ^ nums[i]
     }
     return res
 }

 func singleNumber2(nums []int) int {
     if len(nums) == 0 {
         return 0
     }

     numsMap := make(map[int]int)
     for i:=0;i<len(nums);i++ {
         if numsMap[nums[i]] == 0 {
             numsMap[nums[i]] = 1
         } else {
             numsMap[nums[i]]++
         }
     }

     for k,v := range numsMap {
         if v == 1 {
             return k
         }
     }

     return 0
 }

代码

results matching ""

    No results matching ""