auto commit
This commit is contained in:
@ -1,22 +1,24 @@
|
||||
# Leetcode 题解 - 位运算
|
||||
<!-- GFM-TOC -->
|
||||
* [0. 原理](#0-原理)
|
||||
* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
|
||||
* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
|
||||
* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
|
||||
* [4. 数组中不重复的两个元素](#4-数组中不重复的两个元素)
|
||||
* [5. 翻转一个数的比特位](#5-翻转一个数的比特位)
|
||||
* [6. 不用额外变量交换两个整数](#6-不用额外变量交换两个整数)
|
||||
* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
|
||||
* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
|
||||
* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
|
||||
* [10. 求一个数的补码](#10-求一个数的补码)
|
||||
* [11. 实现整数的加法](#11-实现整数的加法)
|
||||
* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
|
||||
* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0-\~-n-每个数的二进制表示中-1-的个数)
|
||||
* [Leetcode 题解 - 位运算](#leetcode-题解---位运算)
|
||||
* [0. 原理](#0-原理)
|
||||
* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
|
||||
* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
|
||||
* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
|
||||
* [4. 数组中不重复的两个元素](#4-数组中不重复的两个元素)
|
||||
* [5. 翻转一个数的比特位](#5-翻转一个数的比特位)
|
||||
* [6. 不用额外变量交换两个整数](#6-不用额外变量交换两个整数)
|
||||
* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
|
||||
* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
|
||||
* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
|
||||
* [10. 求一个数的补码](#10-求一个数的补码)
|
||||
* [11. 实现整数的加法](#11-实现整数的加法)
|
||||
* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
|
||||
* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0-\~-n-每个数的二进制表示中-1-的个数)
|
||||
<!-- GFM-TOC -->
|
||||
|
||||
|
||||
# 0. 原理
|
||||
## 0. 原理
|
||||
|
||||
**基本原理**
|
||||
|
||||
@ -76,7 +78,7 @@ n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1
|
||||
|
||||
**移位运算**
|
||||
|
||||
\>\> n 为算术右移,相当于除以 2n,例如 -7 \>\> 2 = -2。
|
||||
\\>\\> n 为算术右移,相当于除以 2n,例如 -7 \\>\\> 2 = -2。
|
||||
|
||||
```
|
||||
11111111111111111111111111111001 >> 2
|
||||
@ -84,7 +86,7 @@ n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1
|
||||
11111111111111111111111111111110
|
||||
```
|
||||
|
||||
\>\>\> n 为无符号右移,左边会补上 0。例如 -7 \>\>\> 2 = 1073741822。
|
||||
\\>\\>\\> n 为无符号右移,左边会补上 0。例如 -7 \\>\\>\\> 2 = 1073741822。
|
||||
|
||||
```
|
||||
11111111111111111111111111111001 >>> 2
|
||||
@ -92,7 +94,7 @@ n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1
|
||||
00111111111111111111111111111111
|
||||
```
|
||||
|
||||
<< n 为算术左移,相当于乘以 2n。-7 << 2 = -28。
|
||||
\<\< n 为算术左移,相当于乘以 2n。-7 \<\< 2 = -28。
|
||||
|
||||
```
|
||||
11111111111111111111111111111001 << 2
|
||||
@ -104,11 +106,11 @@ n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1
|
||||
|
||||
要获取 111111111,将 0 取反即可,\~0。
|
||||
|
||||
要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask :00010000。
|
||||
要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1\<\<(i-1) 。例如 1\<\<4 得到只有第 5 位为 1 的 mask :00010000。
|
||||
|
||||
要得到 1 到 i 位为 1 的 mask,(1<<i)-1 即可,例如将 (1<<4)-1 = 00010000-1 = 00001111。
|
||||
要得到 1 到 i 位为 1 的 mask,(1\<\<i)-1 即可,例如将 (1\<\<4)-1 = 00010000-1 = 00001111。
|
||||
|
||||
要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 \~((1<<i)-1)。
|
||||
要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 \~((1\<\<i)-1)。
|
||||
|
||||
**Java 中的位操作**
|
||||
|
||||
@ -118,7 +120,7 @@ static int Integer.highestOneBit(); // 获得最高位
|
||||
static String toBinaryString(int i); // 转换为二进制表示的字符串
|
||||
```
|
||||
|
||||
# 1. 统计两个数的二进制表示有多少位不同
|
||||
## 1. 统计两个数的二进制表示有多少位不同
|
||||
|
||||
461. Hamming Distance (Easy)
|
||||
|
||||
@ -173,7 +175,7 @@ public int hammingDistance(int x, int y) {
|
||||
}
|
||||
```
|
||||
|
||||
# 2. 数组中唯一一个不重复的元素
|
||||
## 2. 数组中唯一一个不重复的元素
|
||||
|
||||
136\. Single Number (Easy)
|
||||
|
||||
@ -194,7 +196,7 @@ public int singleNumber(int[] nums) {
|
||||
}
|
||||
```
|
||||
|
||||
# 3. 找出数组中缺失的那个数
|
||||
## 3. 找出数组中缺失的那个数
|
||||
|
||||
268\. Missing Number (Easy)
|
||||
|
||||
@ -217,7 +219,7 @@ public int missingNumber(int[] nums) {
|
||||
}
|
||||
```
|
||||
|
||||
# 4. 数组中不重复的两个元素
|
||||
## 4. 数组中不重复的两个元素
|
||||
|
||||
260\. Single Number III (Medium)
|
||||
|
||||
@ -243,7 +245,7 @@ public int[] singleNumber(int[] nums) {
|
||||
}
|
||||
```
|
||||
|
||||
# 5. 翻转一个数的比特位
|
||||
## 5. 翻转一个数的比特位
|
||||
|
||||
190\. Reverse Bits (Easy)
|
||||
|
||||
@ -290,7 +292,7 @@ private int reverseByte(byte b) {
|
||||
}
|
||||
```
|
||||
|
||||
# 6. 不用额外变量交换两个整数
|
||||
## 6. 不用额外变量交换两个整数
|
||||
|
||||
[程序员代码面试指南 :P317](#)
|
||||
|
||||
@ -300,7 +302,7 @@ b = a ^ b;
|
||||
a = a ^ b;
|
||||
```
|
||||
|
||||
# 7. 判断一个数是不是 2 的 n 次方
|
||||
## 7. 判断一个数是不是 2 的 n 次方
|
||||
|
||||
231\. Power of Two (Easy)
|
||||
|
||||
@ -322,7 +324,7 @@ public boolean isPowerOfTwo(int n) {
|
||||
}
|
||||
```
|
||||
|
||||
# 8. 判断一个数是不是 4 的 n 次方
|
||||
## 8. 判断一个数是不是 4 的 n 次方
|
||||
|
||||
342\. Power of Four (Easy)
|
||||
|
||||
@ -344,7 +346,7 @@ public boolean isPowerOfFour(int num) {
|
||||
}
|
||||
```
|
||||
|
||||
# 9. 判断一个数的位级表示是否不会出现连续的 0 和 1
|
||||
## 9. 判断一个数的位级表示是否不会出现连续的 0 和 1
|
||||
|
||||
693\. Binary Number with Alternating Bits (Easy)
|
||||
|
||||
@ -371,7 +373,7 @@ public boolean hasAlternatingBits(int n) {
|
||||
}
|
||||
```
|
||||
|
||||
# 10. 求一个数的补码
|
||||
## 10. 求一个数的补码
|
||||
|
||||
476\. Number Complement (Easy)
|
||||
|
||||
@ -428,15 +430,15 @@ public int findComplement(int num) {
|
||||
}
|
||||
```
|
||||
|
||||
# 11. 实现整数的加法
|
||||
## 11. 实现整数的加法
|
||||
|
||||
371\. Sum of Two Integers (Easy)
|
||||
|
||||
[Leetcode](https://leetcode.com/problems/sum-of-two-integers/description/) / [力扣](https://leetcode-cn.com/problems/sum-of-two-integers/description/)
|
||||
|
||||
a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。
|
||||
a ^ b 表示没有考虑进位的情况下两数的和,(a & b) \<\< 1 就是进位。
|
||||
|
||||
递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。
|
||||
递归会终止的原因是 (a & b) \<\< 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。
|
||||
|
||||
```java
|
||||
public int getSum(int a, int b) {
|
||||
@ -444,7 +446,7 @@ public int getSum(int a, int b) {
|
||||
}
|
||||
```
|
||||
|
||||
# 12. 字符串数组最大乘积
|
||||
## 12. 字符串数组最大乘积
|
||||
|
||||
318\. Maximum Product of Word Lengths (Medium)
|
||||
|
||||
@ -481,7 +483,7 @@ public int maxProduct(String[] words) {
|
||||
}
|
||||
```
|
||||
|
||||
# 13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数
|
||||
## 13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数
|
||||
|
||||
338\. Counting Bits (Medium)
|
||||
|
||||
@ -499,10 +501,3 @@ public int[] countBits(int num) {
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>
|
||||
|
Reference in New Issue
Block a user