算法练习第九天——只出现一次的数字

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

算法练习第九天——只出现一次的数字


算法练习第九天——只出现一次的数字


只出现一次的数字题目


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


示例一:


输入: [3,3,5] 输出: 5


示例二:


输入: [5,6,2,6,2] 输出: 5


示例三:


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


示例四:


输入: [0,10,2,10,2] 输出: 0


解题思路


方法一:哈希表


我们可以从题目入手,既然给定的数组为非空,并且除了一个元素其余元素都出现了两次,说明数组也不止一个元素,那我们可以创建一个哈希表,然后通过数字设置为键去累加值,在数组遍历结束后再对哈希表进行遍历寻找值为1的键,就是我们要输出的答案。

func singleNumber(nums []int) int {
    a:=map[int]int{}
    var b int
    for _,j := range nums{
        a[j]++
    }
    for i,j := range a{
        if j == 1{
            b = i
        }
    }
    return b
}

方法二:位运算


按位异或操作符的性质我们可以发现一个按位异或操作的性质:一个值和0进行按位异或操作所得为该值,相同的两个值进行异或操作,所得为0,根据这个性质,由于每个重复元素重复两次,故他们在遍历后将相互抵消,而唯一元素只出现一次,故将得到保留

func singleNumber(nums []int) int {
    single := 0
    for _, num := range nums {
        single ^= num
    }
    return single
}

该解法复杂度分析


  • 时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。


  • 空间复杂度:O(1)。


相关文章
|
1月前
|
存储 算法 索引
模拟算法题练习(二)(DNA序列修正、无尽的石头)
模拟算法题练习(二)(DNA序列修正、无尽的石头)
|
1月前
|
并行计算 算法 测试技术
模拟算法题练习(一)(扫雷,灌溉,回文日期)
模拟算法题练习(一)(扫雷,灌溉,回文日期)
|
8月前
|
算法
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
|
4月前
|
算法 图形学
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
154 0
|
3月前
|
存储 算法 搜索推荐
Leetcode算法题练习(一)
Leetcode算法题练习(一)
54 0
|
9月前
|
算法 前端开发
算法练习--深拷贝与浅拷贝
深拷贝与浅拷贝
59 0
|
7月前
|
算法 Java
Java之包装类的算法小题的练习
Java之包装类的算法小题的练习
47 0
|
8月前
|
算法
算法练习Day56|583. 两个字符串的删除操作 ● 72. 编辑距离
算法练习Day56|583. 两个字符串的删除操作 ● 72. 编辑距离