博客主页:​​🏆看看是李XX还是李歘歘 🏆

🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺

💗点关注不迷路,总有一些📖知识点📖是你想要的💗

⛽️今天的内容是Leetcode 137. 只出现一次的数字 II⛽️💻💻💻

​137. 只出现一次的数字 II​

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

提示:

1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

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

map:



func singleNumber(nums []int) int {
// map
m:=map[int]int{}
for _,v:=range nums {
m[v]++
}
for k,v := range m{
if v==1 {
return k
}
}
return 0
}



先排序再查找:



func singleNumber(nums []int) int {
// 先排序,在查找
sort.Ints(nums)
for i:=0;i<len(nums)-1;i=i+3{
if nums[i]!=nums[i+1]{
return nums[i]
}
}
return nums[len(nums)-1]
}



相似题:

位运算:高级用法

使用a保存出现了一次的数,使用b保存出现了两次的数,返回出现了一次的数a

相当于将出现三次的问题转换为出现两次的问题,先将已经出现过两次的数字保存下来,并做一次,当出现第三次的时候,与前两次异或



func singleNumber(nums []int) int {
// 位运算
a, b := 0, 0
for i := 0; i < len(nums); i++ {
a = (a ^ nums[i]) & (^b) // a:保留出现1次的数
b = (b ^ nums[i]) & (^a) // b:保留出现2次的数
}
return a // 最后返回只出现1次的数
}



137. 只出现一次的数字 II、Leetcode的Go实现_蓝桥杯