Skip to content

Commit 767bace

Browse files
authored
feat: add solutions to lcci problem: No.05.01 (#1389)
No.05.01.Insert Into Bits
1 parent b8c6ff9 commit 767bace

File tree

16 files changed

+143
-30
lines changed

16 files changed

+143
-30
lines changed

lcci/05.01.Insert Into Bits/README.md

+50-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
## 题目描述
66

77
<!-- 这里写题目描述 -->
8+
89
<p>插入。给定两个32位的整数<code>N</code>与<code>M</code>,以及表示比特位置的<code>i</code>与<code>j</code>。编写一种方法,将<code>M</code>插入<code>N</code>,使得M从N的第j位开始,到第<code>i</code>位结束。假定从<code>j</code>位到<code>i</code>位足以容纳<code>M</code>,也即若M = 10 011,那么j和i之间至少可容纳5个位。例如,不可能出现j = 3和i = 2的情况,因为第3位和第2位之间放不下M。</p>
910

1011
<p> <strong>示例1:</strong></p>
@@ -25,15 +26,24 @@
2526

2627
<!-- 这里可写通用的实现逻辑 -->
2728

29+
**方法一:位运算**
30+
31+
我们先将 $N$ 的第 $i$ 位到第 $j$ 位清零,然后再将 $M$ 左移 $i$ 位,最后将 $M$ 与 $N$ 进行或运算。
32+
33+
时间复杂度 $O(\log n)$,其中 $n$ 是 $N$ 的大小。空间复杂度 $O(1)$。
34+
2835
<!-- tabs:start -->
2936

3037
### **Python3**
3138

3239
<!-- 这里可写当前语言的特殊实现逻辑 -->
3340

3441
```python
35-
36-
42+
class Solution:
43+
def insertBits(self, N: int, M: int, i: int, j: int) -> int:
44+
for k in range(i, j + 1):
45+
N &= ~(1 << k)
46+
return N | M << i
3747
```
3848

3949
### **Java**
@@ -43,18 +53,53 @@
4353
```java
4454
class Solution {
4555
public int insertBits(int N, int M, int i, int j) {
46-
for (int k = i; k <= j; k++) {
56+
for (int k = i; k <= j; ++k) {
4757
N &= ~(1 << k);
4858
}
49-
return N ^ (M << i);
59+
return N | M << i;
5060
}
5161
}
5262
```
5363

54-
### **...**
64+
### **C++**
5565

66+
```cpp
67+
class Solution {
68+
public:
69+
int insertBits(int N, int M, int i, int j) {
70+
for (int k = i; k <= j; ++k) {
71+
N &= ~(1 << k);
72+
}
73+
return N | M << i;
74+
}
75+
};
5676
```
5777
78+
### **Go**
79+
80+
```go
81+
func insertBits(N int, M int, i int, j int) int {
82+
for k := i; k <= j; k++ {
83+
N &= ^(1 << k)
84+
}
85+
return N | M<<i
86+
}
87+
```
88+
89+
### **TypeScript**
90+
91+
```ts
92+
function insertBits(N: number, M: number, i: number, j: number): number {
93+
for (let k = i; k <= j; ++k) {
94+
N &= ~(1 << k);
95+
}
96+
return N | (M << i);
97+
}
98+
```
99+
100+
### **...**
101+
102+
```
58103
59104
```
60105

lcci/05.01.Insert Into Bits/README_EN.md

+43-3
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,59 @@
2929
### **Python3**
3030

3131
```python
32-
32+
class Solution:
33+
def insertBits(self, N: int, M: int, i: int, j: int) -> int:
34+
for k in range(i, j + 1):
35+
N &= ~(1 << k)
36+
return N | M << i
3337
```
3438

3539
### **Java**
3640

3741
```java
3842
class Solution {
3943
public int insertBits(int N, int M, int i, int j) {
40-
for (int k = i; k <= j; k++) {
44+
for (int k = i; k <= j; ++k) {
45+
N &= ~(1 << k);
46+
}
47+
return N | M << i;
48+
}
49+
}
50+
```
51+
52+
### **C++**
53+
54+
```cpp
55+
class Solution {
56+
public:
57+
int insertBits(int N, int M, int i, int j) {
58+
for (int k = i; k <= j; ++k) {
4159
N &= ~(1 << k);
4260
}
43-
return N ^ (M << i);
61+
return N | M << i;
62+
}
63+
};
64+
```
65+
66+
### **Go**
67+
68+
```go
69+
func insertBits(N int, M int, i int, j int) int {
70+
for k := i; k <= j; k++ {
71+
N &= ^(1 << k)
72+
}
73+
return N | M<<i
74+
}
75+
```
76+
77+
### **TypeScript**
78+
79+
```ts
80+
function insertBits(N: number, M: number, i: number, j: number): number {
81+
for (let k = i; k <= j; ++k) {
82+
N &= ~(1 << k);
4483
}
84+
return N | (M << i);
4585
}
4686
```
4787

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution {
2+
public:
3+
int insertBits(int N, int M, int i, int j) {
4+
for (int k = i; k <= j; ++k) {
5+
N &= ~(1 << k);
6+
}
7+
return N | M << i;
8+
}
9+
};
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
func insertBits(N int, M int, i int, j int) int {
2+
for k := i; k <= j; k++ {
3+
N &= ^(1 << k)
4+
}
5+
return N | M<<i
6+
}
+7-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
class Solution {
2-
public int insertBits(int N, int M, int i, int j) {
3-
for (int k = i; k <= j; k++) {
4-
N &= ~(1 << k);
5-
}
6-
return N ^ (M << i);
7-
}
1+
class Solution {
2+
public int insertBits(int N, int M, int i, int j) {
3+
for (int k = i; k <= j; ++k) {
4+
N &= ~(1 << k);
5+
}
6+
return N | M << i;
7+
}
88
}
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Solution:
2+
def insertBits(self, N: int, M: int, i: int, j: int) -> int:
3+
for k in range(i, j + 1):
4+
N &= ~(1 << k)
5+
return N | M << i
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
function insertBits(N: number, M: number, i: number, j: number): number {
2+
for (let k = i; k <= j; ++k) {
3+
N &= ~(1 << k);
4+
}
5+
return N | (M << i);
6+
}

lcci/05.02.Bianry Number to String/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
## 题目描述
66

77
<!-- 这里写题目描述 -->
8+
89
<p>二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字不在0和1之间,<strong>或者</strong>无法精确地用32位以内的二进制表示,则打印&ldquo;ERROR&rdquo;。</p>
910
<p><strong>示例1:</strong></p>
1011
<pre><strong> 输入</strong>:0.625

lcci/05.03.Reverse Bits/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
## 题目描述
66

77
<!-- 这里写题目描述 -->
8+
89
<p>给定一个32位整数 <code>num</code>,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。</p>
910
<p><strong>示例 1:</strong></p>
1011
<pre><strong>输入:</strong> <code>num</code> = 1775(11011101111<sub>2</sub>)

lcci/05.04.Closed Number/README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ class Solution:
5353
ans = [-1] * 2
5454
dirs = (0, 1, 0)
5555
for p in range(2):
56+
a, b = dirs[p], dirs[p + 1]
5657
x = num
5758
for i in range(1, 31):
58-
a, b = dirs[p], dirs[p + 1]
5959
if (x >> i & 1) == a and (x >> (i - 1) & 1) == b:
6060
x ^= 1 << i
6161
x ^= 1 << (i - 1)
@@ -83,9 +83,9 @@ class Solution {
8383
int[] ans = {-1, -1};
8484
int[] dirs = {0, 1, 0};
8585
for (int p = 0; p < 2; ++p) {
86+
int a = dirs[p], b = dirs[p + 1];
8687
int x = num;
8788
for (int i = 1; i < 31; ++i) {
88-
int a = dirs[p], b = dirs[p + 1];
8989
if ((x >> i & 1) == a && (x >> (i - 1) & 1) == b) {
9090
x ^= 1 << i;
9191
x ^= 1 << (i - 1);
@@ -121,9 +121,9 @@ public:
121121
vector<int> ans(2, -1);
122122
int dirs[3] = {0, 1, 0};
123123
for (int p = 0; p < 2; ++p) {
124+
int a = dirs[p], b = dirs[p + 1];
124125
int x = num;
125126
for (int i = 1; i < 31; ++i) {
126-
int a = dirs[p], b = dirs[p + 1];
127127
if ((x >> i & 1) == a && (x >> (i - 1) & 1) == b) {
128128
x ^= 1 << i;
129129
x ^= 1 << (i - 1);
@@ -157,9 +157,9 @@ func findClosedNumbers(num int) []int {
157157
ans := []int{-1, -1}
158158
dirs := [3]int{0, 1, 0}
159159
for p := 0; p < 2; p++ {
160+
a, b := dirs[p], dirs[p+1]
160161
x := num
161162
for i := 1; i < 31; i++ {
162-
a, b := dirs[p], dirs[p+1]
163163
if x>>i&1 == a && x>>(i-1)&1 == b {
164164
x ^= 1 << i
165165
x ^= 1 << (i - 1)
@@ -192,9 +192,9 @@ function findClosedNumbers(num: number): number[] {
192192
const ans: number[] = [-1, -1];
193193
const dirs: number[] = [0, 1, 0];
194194
for (let p = 0; p < 2; ++p) {
195+
const [a, b] = [dirs[p], dirs[p + 1]];
195196
let x = num;
196197
for (let i = 1; i < 31; ++i) {
197-
const [a, b] = [dirs[p], dirs[p + 1]];
198198
if (((x >> i) & 1) === a && ((x >> (i - 1)) & 1) === b) {
199199
x ^= 1 << i;
200200
x ^= 1 << (i - 1);

lcci/05.04.Closed Number/README_EN.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class Solution:
3939
ans = [-1] * 2
4040
dirs = (0, 1, 0)
4141
for p in range(2):
42+
a, b = dirs[p], dirs[p + 1]
4243
x = num
4344
for i in range(1, 31):
44-
a, b = dirs[p], dirs[p + 1]
4545
if (x >> i & 1) == a and (x >> (i - 1) & 1) == b:
4646
x ^= 1 << i
4747
x ^= 1 << (i - 1)
@@ -67,9 +67,9 @@ class Solution {
6767
int[] ans = {-1, -1};
6868
int[] dirs = {0, 1, 0};
6969
for (int p = 0; p < 2; ++p) {
70+
int a = dirs[p], b = dirs[p + 1];
7071
int x = num;
7172
for (int i = 1; i < 31; ++i) {
72-
int a = dirs[p], b = dirs[p + 1];
7373
if ((x >> i & 1) == a && (x >> (i - 1) & 1) == b) {
7474
x ^= 1 << i;
7575
x ^= 1 << (i - 1);
@@ -105,9 +105,9 @@ public:
105105
vector<int> ans(2, -1);
106106
int dirs[3] = {0, 1, 0};
107107
for (int p = 0; p < 2; ++p) {
108+
int a = dirs[p], b = dirs[p + 1];
108109
int x = num;
109110
for (int i = 1; i < 31; ++i) {
110-
int a = dirs[p], b = dirs[p + 1];
111111
if ((x >> i & 1) == a && (x >> (i - 1) & 1) == b) {
112112
x ^= 1 << i;
113113
x ^= 1 << (i - 1);
@@ -141,9 +141,9 @@ func findClosedNumbers(num int) []int {
141141
ans := []int{-1, -1}
142142
dirs := [3]int{0, 1, 0}
143143
for p := 0; p < 2; p++ {
144+
a, b := dirs[p], dirs[p+1]
144145
x := num
145146
for i := 1; i < 31; i++ {
146-
a, b := dirs[p], dirs[p+1]
147147
if x>>i&1 == a && x>>(i-1)&1 == b {
148148
x ^= 1 << i
149149
x ^= 1 << (i - 1)
@@ -176,9 +176,9 @@ function findClosedNumbers(num: number): number[] {
176176
const ans: number[] = [-1, -1];
177177
const dirs: number[] = [0, 1, 0];
178178
for (let p = 0; p < 2; ++p) {
179+
const [a, b] = [dirs[p], dirs[p + 1]];
179180
let x = num;
180181
for (let i = 1; i < 31; ++i) {
181-
const [a, b] = [dirs[p], dirs[p + 1]];
182182
if (((x >> i) & 1) === a && ((x >> (i - 1)) & 1) === b) {
183183
x ^= 1 << i;
184184
x ^= 1 << (i - 1);

lcci/05.04.Closed Number/Solution.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ class Solution {
44
vector<int> ans(2, -1);
55
int dirs[3] = {0, 1, 0};
66
for (int p = 0; p < 2; ++p) {
7+
int a = dirs[p], b = dirs[p + 1];
78
int x = num;
89
for (int i = 1; i < 31; ++i) {
9-
int a = dirs[p], b = dirs[p + 1];
1010
if ((x >> i & 1) == a && (x >> (i - 1) & 1) == b) {
1111
x ^= 1 << i;
1212
x ^= 1 << (i - 1);

lcci/05.04.Closed Number/Solution.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ func findClosedNumbers(num int) []int {
22
ans := []int{-1, -1}
33
dirs := [3]int{0, 1, 0}
44
for p := 0; p < 2; p++ {
5+
a, b := dirs[p], dirs[p+1]
56
x := num
67
for i := 1; i < 31; i++ {
7-
a, b := dirs[p], dirs[p+1]
88
if x>>i&1 == a && x>>(i-1)&1 == b {
99
x ^= 1 << i
1010
x ^= 1 << (i - 1)

lcci/05.04.Closed Number/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ public int[] findClosedNumbers(int num) {
33
int[] ans = {-1, -1};
44
int[] dirs = {0, 1, 0};
55
for (int p = 0; p < 2; ++p) {
6+
int a = dirs[p], b = dirs[p + 1];
67
int x = num;
78
for (int i = 1; i < 31; ++i) {
8-
int a = dirs[p], b = dirs[p + 1];
99
if ((x >> i & 1) == a && (x >> (i - 1) & 1) == b) {
1010
x ^= 1 << i;
1111
x ^= 1 << (i - 1);

lcci/05.04.Closed Number/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ def findClosedNumbers(self, num: int) -> List[int]:
33
ans = [-1] * 2
44
dirs = (0, 1, 0)
55
for p in range(2):
6+
a, b = dirs[p], dirs[p + 1]
67
x = num
78
for i in range(1, 31):
8-
a, b = dirs[p], dirs[p + 1]
99
if (x >> i & 1) == a and (x >> (i - 1) & 1) == b:
1010
x ^= 1 << i
1111
x ^= 1 << (i - 1)

lcci/05.04.Closed Number/Solution.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ function findClosedNumbers(num: number): number[] {
22
const ans: number[] = [-1, -1];
33
const dirs: number[] = [0, 1, 0];
44
for (let p = 0; p < 2; ++p) {
5+
const [a, b] = [dirs[p], dirs[p + 1]];
56
let x = num;
67
for (let i = 1; i < 31; ++i) {
7-
const [a, b] = [dirs[p], dirs[p + 1]];
88
if (((x >> i) & 1) === a && ((x >> (i - 1)) & 1) === b) {
99
x ^= 1 << i;
1010
x ^= 1 << (i - 1);

0 commit comments

Comments
 (0)