1题目描述
1.1笔者分析
以下均为leetcod官网某一大佬的分析思路:
大脑的思考过程
这题拿到手,第一反应是用hash表,没有思考细节,只是觉得hash表肯定是可以搞定的,但是空间复杂度是O(n),不满足题意。
接着开始思考,如何才能做到空间复杂度是O(1)呢?脑袋开始疯狂打转,但没有思路。没办法,退回原点。
心想,如果使用暴力破解法,该如何解决,很简单:每次从数组中去一个数,记为cur,然后从剩下的数中查找,如果找不到,则cur即为要找的那个数,这种解法时间复杂度是O(n*n)。
继续思考,如何再继续降低复杂度呢?想到了排序!!!
再继续思考,如何能把时间复杂度降到O(n),有两个突破点:
1.暴力解法做了很多重复的工作
2.要充分利用题目的已有信息
通过这一点,我没有想到思路,通过第二点,我还真找到突破口。反复看了好几遍题目,找到了一个很重要的信息:除了某个元素只出现一次以外,其余每个元素均出现两次。觉得这是个突破口!!!—异或运算!
int ans=nums[0];
if(nums.length>1){
for(int i=1;i<nums.length;i++){
ans=ans^nums[i];
}
}
总结
今天真的是对位运算刮目相看了,每日十题打卡第三十八天,以下图为证