这虽然是一道难度简单的题,但是它的解法,博主个人觉得很巧妙,是博主以前没有见过的,于是便写下这篇题解来记录一下。
方法一:hashmap这种方法其实是很好理解的,首先遍历数组,用一个map的集合储存每个出现的数字对应的次数,然后再遍历一遍数组,找出map集合中对应的只出现一次的数字,当然这也是博主第一时间想到的方法,很简单,也很好理解,附上代码:
class Solution {
public:
int singleNumber(vector& nums) {
int n=nums.size();
maparr;//用map进行映射
for(int i=0;i
方法二:异或运算(重点)
首先我们仔细阅读题目就会发现除了只有一个元素出现一次,其他元素都出现两次,这就是我们的突破口,其实在这里就可以引出我们的异或运算了,首先我们需要知道异或运算的一些性质:
1、任何数和0做异或运算,结果都为原来的数本身,即a⊕0=a;
2、任何数与自身做异或运算结果为0,即a⊕a=0;
3、异或运算满足交换律和结合律,即a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b;
由上面的三条性质,我们再结合题意,我们就可以发现对给出的元素进行异或运算时,只要结合交换律和结合律,最终的异或的结果就是那个只出现了一次的数字,也是我们要求的数字:
附上代码:
class Solution{
public:
int singleNumber(vector& nums){
int n=nums.size();//求数组的长度
int ans=0;
for(int i=0;i
总结
其实,到这这道题差不多就结束了,单纯题本身而言,是没有什么难度的,毕竟官方给的难度是——简单。但是,我们其实可以好好思考一下这种做题的思路,如何得到更好的优化,如何一步一步的递进,就像我常说的,我们做题不是一味的只是刷题,更重要的是锻炼我们如何通过一道题来锻炼我们的思维,好啦,今天的题解就到这儿了,大家加油哦,刷题不要停!冲冲冲!



