# 0136. Single Number ###### tags: `Leetcode` `Easy` `Bit Manipulation` `XOR` Link: https://leetcode.com/problems/single-number/ ## 思路 ### 思路一 采用hashset,对于某个元素nums[i],如果存在在hashset里面,则删除该元素,如果没有,则加进hashset里面,最后hashset里面剩的唯一一个元素即是答案 ### 思路二 (Very Tricky) 异或运算(可以用来消除重复) 异或运算的性质 ![](https://i.imgur.com/0FMV1XI.png) ![](https://i.imgur.com/RRcyUy9.png) ## Code ### 思路一 ```java= class Solution { public int singleNumber(int[] nums) { HashSet<Integer> set = new HashSet<Integer>(); for(int i = 0;i < nums.length;i++){ if(!set.remove(nums[i])){ set.add(nums[i]); } } int retValue=0; for(int i:set){ // System.out.println(i); retValue = i; } return retValue; } } ``` ### 思路二 ```java= class Solution { public int singleNumber(int[] nums) { int retValue = 0; for(int i = 0;i < nums.length;i++){ retValue ^= nums[i]; } return retValue; } } ``` ## 注意 异或运算的其他应用 - 不用比较运算符来比较两个数 直接```A^B==0```就可以判断```A==B``` - 实现不用其他空间就交换两个变量 ```java a = a^b b = a^b //a^b^b = a^0 = a a = a^b //a^b^a = b ```