algorithm-base/animation-simulation/求次数问题/只出现一次的数.md

624 lines
16 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

> **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
>
>
> <u>[****](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
#### [136. ](https://leetcode-cn.com/problems/single-number/)
>
1:
> : [2,2,1]
> : 1
2:
> : [4,1,2,1,2]
> : 4
~
### HashMap
####
HashMap
![](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/哈希表解法.1kefww8xsig0.png)
####
Java Code:
```java
class Solution {
public int singleNumber(int[] nums) {
//特殊情况
if (nums.length == 1) {
return nums[0];
}
//HashMap
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
//将其存入哈希表中含义为若该元素不存在则存入表中并计数为1若已经存在获取次数并加1
for (int x : nums) {
map.put(x , map.getOrDefault(x,0) + 1);
}
//遍历出出现次数为1的情况
for (int y : map.keySet()) {
if(map.get(y) == 1){
return y;
}
}
}
}
```
C++ Code:
```cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
//特殊情况
if (nums.size() == 1) {
return nums[0];
}
//HashMap
unordered_map<int,int> map;
//将其存入哈希表中含义为若该元素不存在则存入表中并计数为1若已经存在获取次数并加1
for (int x : nums) {
if (map.find(x) == map.end()) {
map.insert({x, 0});
}
map[x] += 1;
}
//遍历出出现次数为1的情况
for (int y : nums) {
if(map.at(y) == 1){
return y;
}
}
return -1;
}
};
```
JS Code:
```javascript
var singleNumber = function (nums) {
//特殊情况
if (nums.length === 1) {
return nums[0];
}
//HashMap
map = {};
//将其存入哈希表中含义为若该元素不存在则存入表中并计数为1若已经存在获取次数并加1
for (let x of nums) {
if (!(x in map)) {
map[x] = 0;
}
map[x] += 1;
}
//遍历出出现次数为1的情况
for (let key in map) {
if (map[key] === 1) {
return key;
}
}
};
```
Python Code:
```python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#
if len(nums) == 1:
return nums[0]
# HashMap
map_ = {}
# 11
for x in nums:
map_.setdefault(x, 0)
map_[x] += 1
# 1
for y, count in map_.items():
if count == 1:
return y
```
Go Code:
```go
func singleNumber(nums []int) int {
if len(nums) == 1 {
return nums[0]
}
m := map[int]int{}
for _, x := range nums {
m[x]++
}
for k, v := range m {
if v == 1 {
return k
}
}
return 0
}
```
###
####
![](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/排序.6sp72k3iaqw0.gif)
####
Java Code:
```java
class Solution {
public int singleNumber(int[] nums) {
if (nums.length == 1){
return nums[0];
}
//排序
Arrays.sort(nums);
for (int i = 1; i < nums.length-1; i+=2){
if (nums[i] != nums[i-1]){
return nums[i-1];
}
}
return nums[nums.length-1];
}
}
```
C++ Code:
```cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
//排序
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size() - 1; i += 2){
if (nums[i] != nums[i - 1]){
return nums[i - 1];
}
}
return nums[nums.size() - 1];
}
};
```
JS Code:
```javascript
var singleNumber = function (nums) {
// 排序
nums.sort();
for (let i = 1; i < nums.length - 1; i += 2) {
if (nums[i] != nums[i - 1]) {
return nums[i - 1];
}
}
return nums[nums.length - 1];
};
```
Python Code:
```python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#
nums.sort()
for i in range(1, len(nums), 2):
if nums[i] != nums[i - 1]:
return nums[i - 1]
return nums[len(nums) - 1]
```
Go Code:
```go
func singleNumber(nums []int) int {
if len(nums) == 1 {
return nums[0]
}
sort.Ints(nums)
for i := 1; i < len(nums) - 1; i+=2 {
if nums[i] == nums[i - 1] {
continue
} else {
return nums[i - 1]
}
}
return nums[len(nums) - 1]
}
```
### HashSet
####
HashSet HashSet HashMap HashSet HashSet HashSet () HashSet HashSet
![HashSet](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/HashSet.4b6dcxwj07c0.gif)
####
Java Code:
```java
class Solution {
public int singleNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
//循环遍历
for (int x : nums){
//已经存在,则去除
if(set.contains(x)){
set.remove(x);
//否则存入
} else {
set.add(x);
}
}
//返回仅剩的一个元素
return set.iterator().next();
}
}
```
C++ Code:
```cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_set<int> set;
//循环遍历
for (int x : nums) {
//已经存在,则去除
if (set.find(x) == set.end()) {
set.insert(x);
//否则存入
} else {
set.erase(x);
}
}
//返回仅剩的一个元素
return *set.begin();
}
};
```
JS Code:
```javascript
var singleNumber = function (nums) {
let set = new Set();
//循环遍历
for (let x of nums) {
//已经存在,则去除
if (set.has(x)) {
set.delete(x);
//否则存入
} else {
set.add(x);
}
}
return set.values().next().value;
};
```
Python Code:
```python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
set_ = set()
#
for x in nums:
#
if x in set_:
set_.remove(x)
#
else:
set_.add(x)
#
return set_.pop()
```
###
####
使
![](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/栈.6mzstgebww00.gif)
####
Java Code:
```java
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
Stack<Integer> stack = new Stack<>();
for (int x : nums){
if (stack.isEmpty()) {
stack.push(x);
continue;
}
//不同时直接跳出
if (stack.peek() != x) {
break;
}
//相同时出栈
stack.pop();
}
return stack.peek();
}
}
```
C++ Code:
```cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
stack<int> stack;
for (int x: nums) {
if (stack.empty()) {
stack.push(x);
continue;
}
//不同时直接跳出
if (stack.top() != x) {
break;
}
//相同时出栈
stack.pop();
}
return stack.top();
}
};
```
JS Code:
```javascript
var singleNumber = function (nums) {
nums.sort();
let stack = [];
for (let x of nums) {
if (!stack.length) {
stack.push(x);
continue;
}
//不同时直接跳出
if (stack[0] !== x) {
break;
}
//相同时出栈
stack.pop();
}
return stack[0];
};
```
Python Code:
```python
from collections import deque
class Solution:
def singleNumber(self, nums: List[int]) -> int:
if len(nums) == 1:
return nums[0]
nums.sort()
stack = deque()
for x in nums:
if not stack:
stack.append(x)
continue
#
if stack[-1] != x:
break
#
stack.pop()
return stack[-1]
```
###
####
HashSet HashSet setsumnumsum setsum \* 2 - numsum
![](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/求和解法.2tds49a3vzq0.png)
SetSum \* 2 - NumSum = z
####
Java Code:
```java
class Solution {
public int singleNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
int setsum = 0;
int numsum = 0;
for (int x : nums) {
//所有元素的和
numsum += x;
if (!set.contains(x)) {
//HashSet内元素的和
setsum += x;
}
set.add(x);
}
//返回值
return setsum * 2 - numsum;
}
}
```
C++ Code:
```cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_set<int> set;
int setsum = 0;
int numsum = 0;
for (int x : nums) {
//所有元素的和
numsum += x;
if (set.find(x) == set.end()) {
//HashSet内元素的和
setsum += x;
}
set.insert(x);
}
//返回值
return setsum * 2 - numsum;
}
};
```
JS Code:
```javascript
var singleNumber = function (nums) {
let set = new Set();
let setsum = 0;
let numsum = 0;
for (let x of nums) {
//所有元素的和
numsum += x;
if (!set.has(x)) {
setsum += x;
}
//HashSet内元素的和
set.add(x);
}
//返回值
return 2 * setsum - numsum;
};
```
Python Code:
```python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return 2 * sum(set(nums)) - sum(nums)
```
###
####
^
> XOR^ 1 0
> 0 a0 = a
> 0aa = 0
> aba = (aa)b = 0b = b
![](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/异或运算.1myeo11xgqo0.png)
1 0 0
![image-20201129120648802](https://cdn.jsdelivr.net/gh/tan45du/tan45du.github.io.photo@master/photo/image-20201129120648802.2ajgng6zzd7o.png)
####
Java Code:
```java
class Solution {
public int singleNumber(int[] nums) {
int num = 0;
//异或
for (int x : nums) {
num ^= x;
}
return num;
}
}
```
C++ Code:
```cpp
class Solution {
public:
int singleNumber(vector<int>& nums) {
int num = 0;
//异或
for (vector<int>::iterator x = nums.begin(); x != nums.end(); x++) {
num ^= *x;
}
return num;
}
};
```
JS Code:
```javascript
var singleNumber = function (nums) {
//异或
return nums.reduce((num, x) => (num ^= x));
};
```
Python Code:
```python
from functools import reduce
class Solution:
def singleNumber(self, nums: List[int]) -> int:
#
return reduce(lambda num, x: num ^ x, nums, 0)
```
Go Code:
```go
func singleNumber(nums []int) int {
res := 0
for _, x := range nums {
res ^= x
}
return res
}
```
6