版权声明:转载请注明原址,有错误欢迎指出 https://blog.csdn.net/iwts_24/article/details/83315987
题目链接
https://leetcode-cn.com/problems/single-number/
题意
中文题,题意很简单。
题解
很有趣的一个题,最简单粗暴的当然是开辟额外空间暴力计算了。题目限制很多:最多只出现2次、只有唯一答案。那么不仅可以开辟数组这种最暴力的,还可以利用set的唯一性,当set不存在则存入,当set中存在则删除,这样最终set中只有一个最终答案。相比与纯暴力,这样也不需要大量的额外空间,还保证了O(n)的时间复杂度。
不过看大佬题解,了解了利用异或运算的操作,比较6了。上面利用set来线性处理的方式就类似于异或了。假设有一组数据:2、3、5、2、3。那么可以有这样的操作:
2^3^5^2^3
如果进行交换律:
2^2^3^3^5
异或操作化简以后:
0^5 = 5
最终得到的就是单独的那个数。或者说因为必定是2个重复1个额外的,那么匹配的全部匹配归0以后,唯一没有匹配的就是答案了。
Java 代码
class Solution {
public int singleNumber(int[] nums) {
int len = nums.length;
int result = 0;
for(int i = 0;i < len;i++){
result ^= nums[i];
}
return result;
}
}