写在前面
今天做了leetcode上一个简单题,看了挺久没做出来。感兴趣的可以先试试题目再往下看。只出现一次的数字
思路
这题拿到手,第一反应是用hash表,没有思考细节,只是觉得hash表肯定是可以搞定的,但是空间复杂度是 O(n),不满足题意。
接着开始思考,如何才能做到空间复杂度是 O(1) 呢?脑袋开始疯狂打转,但没有思路。没办法,退回原点。
心想,如果使用暴力破解法,该如何解决,很简单:每次从数组中取一个数,记为 cur,然后从剩下的数中查找,如果找不到,则 cur 即为要找的那个数。这种解法时间复杂度是 O(n^2)。
继续思考,如何再继续降低复杂度呢? 想到了排序 !!!
再继续思考,如何能把时间复杂度降到 O(n),有两个突破点:
暴力解法做了很多重复的工作
要充分利用题目的已有信息
- 通过第一点,我没有想到思路,不知道有没有 DP 的解法,可能本人对 DP 使用不是太熟。
- 通过第二点,我还真找到突破口。反复看了好几篇题目,找到了一个很重要的信息:除了某个元素只出现一次以外,其余每个元素均出现两次。 觉得这是个突破口!!!!——异或运算!
代码
func singleNumber(nums []int) int {
result:=nums[0]
n:=len(nums)
for i:=1;i<n;i++{
result ^=nums[i]
}
return result
}
反思
题目这么明显的提示:其他数字都出现了两次。居然没有想到用异或运算,说明自己对位运算还不太熟悉,需要补一下位运算相关知识,多做一些位运算相关的题目。