---
# System prepended metadata

title: 0136. Single Number
tags: [Leetcode, Bit Manipulation, XOR, Easy]

---

# 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
```