开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
力扣136. 只出现一次的数字
一、题目描述:
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
提示:
1 <= nums.length <= 3 * 10^4
-3 * 10^4 <= nums[i] <= 3 * 10^4
除了某个元素只出现一次以外,其余每个元素均出现两次。
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目我的思路很简单,新建一个集合,遍历切片nums,看每一个值是否在集合中出现,如果没有就放入集合,如果在集合中出现就将该值从集合中去掉。因为切片中的元素要么出现2次,要么出现一次,所以当出现第二次时去掉不会出现问题。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的!这道题目还是比较简单的呢!
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
两个相同的数字异或的结果为 0,由于数组中其它元素均出现两次,只有一个元素出现一次,所以可以遍历整个数组,让所有数组元素异或,得到的结果就是只出现一次的那个元素。
func singleNumber(nums []int) int { ans := nums[0] for i := 1; i < len(nums); i++ { ans ^= nums[i] } return ans }
三、AC 代码:
func singleNumber(nums []int) int { n_map := make(map[int]int) for _,s := range nums{ if _,ok := n_map[s];!ok{ n_map[s] = s }else{ delete(n_map,s) } } var s1 int for _,s := range n_map{ s1 = s } return s1 }执行用时:20 ms, 在所有 Go 提交中击败了24.58%的用户
内存消耗:6.6 MB, 在所有 Go 提交中击败了7.99%的用户
通过测试用例:61 / 61
四、总结:
这道题目我的解法执行用时和内存消耗都比较大,呜呜呜。
位运算的解法真的是妙极了!
模板来源
作者:掘金酱
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。