Skip to content

Commit 24613ee

Browse files
committed
feat: add solutions to lc problem: No.1089
No.1089.Duplicate Zeros
1 parent 01a20fb commit 24613ee

File tree

6 files changed

+287
-12
lines changed

6 files changed

+287
-12
lines changed

solution/1000-1099/1089.Duplicate Zeros/README.md

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,124 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:双指针**
45+
4446
<!-- tabs:start -->
4547

4648
### **Python3**
4749

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

5052
```python
51-
53+
class Solution:
54+
def duplicateZeros(self, arr: List[int]) -> None:
55+
"""
56+
Do not return anything, modify arr in-place instead.
57+
"""
58+
n = len(arr)
59+
i, k = -1, 0
60+
while k < n:
61+
i += 1
62+
k += 1 if arr[i] else 2
63+
j = n - 1
64+
if k == n + 1:
65+
arr[j] = 0
66+
i, j = i - 1, j - 1
67+
while ~j:
68+
if arr[i] == 0:
69+
arr[j] = arr[j - 1] = arr[i]
70+
j -= 1
71+
else:
72+
arr[j] = arr[i]
73+
i, j = i - 1, j - 1
5274
```
5375

5476
### **Java**
5577

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

5880
```java
81+
class Solution {
82+
public void duplicateZeros(int[] arr) {
83+
int n = arr.length;
84+
int i = -1, k = 0;
85+
while (k < n) {
86+
++i;
87+
k += arr[i] > 0 ? 1 : 2;
88+
}
89+
int j = n - 1;
90+
if (k == n + 1) {
91+
arr[j--] = 0;
92+
--i;
93+
}
94+
while (j >= 0) {
95+
arr[j] = arr[i];
96+
if (arr[i] == 0) {
97+
arr[--j] = arr[i];
98+
}
99+
--i;
100+
--j;
101+
}
102+
}
103+
}
104+
```
105+
106+
### **C++**
107+
108+
```cpp
109+
class Solution {
110+
public:
111+
void duplicateZeros(vector<int>& arr) {
112+
int n = arr.size();
113+
int i = -1, k = 0;
114+
while (k < n)
115+
{
116+
++i;
117+
k += arr[i] ? 1 : 2;
118+
}
119+
int j = n - 1;
120+
if (k == n + 1)
121+
{
122+
arr[j--] = 0;
123+
--i;
124+
}
125+
while (~j)
126+
{
127+
arr[j] = arr[i];
128+
if (arr[i] == 0) arr[--j] = arr[i];
129+
--i;
130+
--j;
131+
}
132+
}
133+
};
134+
```
59135
136+
### **Go**
137+
138+
```go
139+
func duplicateZeros(arr []int) {
140+
n := len(arr)
141+
i, k := -1, 0
142+
for k < n {
143+
i, k = i+1, k+1
144+
if arr[i] == 0 {
145+
k++
146+
}
147+
}
148+
j := n - 1
149+
if k == n+1 {
150+
arr[j] = 0
151+
i, j = i-1, j-1
152+
}
153+
for j >= 0 {
154+
arr[j] = arr[i]
155+
if arr[i] == 0 {
156+
j--
157+
arr[j] = arr[i]
158+
}
159+
i, j = i-1, j-1
160+
}
161+
}
60162
```
61163

62164
### **...**

solution/1000-1099/1089.Duplicate Zeros/README_EN.md

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,113 @@
4040
### **Python3**
4141

4242
```python
43-
43+
class Solution:
44+
def duplicateZeros(self, arr: List[int]) -> None:
45+
"""
46+
Do not return anything, modify arr in-place instead.
47+
"""
48+
n = len(arr)
49+
i, k = -1, 0
50+
while k < n:
51+
i += 1
52+
k += 1 if arr[i] else 2
53+
j = n - 1
54+
if k == n + 1:
55+
arr[j] = 0
56+
i, j = i - 1, j - 1
57+
while ~j:
58+
if arr[i] == 0:
59+
arr[j] = arr[j - 1] = arr[i]
60+
j -= 1
61+
else:
62+
arr[j] = arr[i]
63+
i, j = i - 1, j - 1
4464
```
4565

4666
### **Java**
4767

4868
```java
69+
class Solution {
70+
public void duplicateZeros(int[] arr) {
71+
int n = arr.length;
72+
int i = -1, k = 0;
73+
while (k < n) {
74+
++i;
75+
k += arr[i] > 0 ? 1 : 2;
76+
}
77+
int j = n - 1;
78+
if (k == n + 1) {
79+
arr[j--] = 0;
80+
--i;
81+
}
82+
while (j >= 0) {
83+
arr[j] = arr[i];
84+
if (arr[i] == 0) {
85+
arr[--j] = arr[i];
86+
}
87+
--i;
88+
--j;
89+
}
90+
}
91+
}
92+
```
93+
94+
### **C++**
95+
96+
```cpp
97+
class Solution {
98+
public:
99+
void duplicateZeros(vector<int>& arr) {
100+
int n = arr.size();
101+
int i = -1, k = 0;
102+
while (k < n)
103+
{
104+
++i;
105+
k += arr[i] ? 1 : 2;
106+
}
107+
int j = n - 1;
108+
if (k == n + 1)
109+
{
110+
arr[j--] = 0;
111+
--i;
112+
}
113+
while (~j)
114+
{
115+
arr[j] = arr[i];
116+
if (arr[i] == 0) arr[--j] = arr[i];
117+
--i;
118+
--j;
119+
}
120+
}
121+
};
122+
```
49123
124+
### **Go**
125+
126+
```go
127+
func duplicateZeros(arr []int) {
128+
n := len(arr)
129+
i, k := -1, 0
130+
for k < n {
131+
i, k = i+1, k+1
132+
if arr[i] == 0 {
133+
k++
134+
}
135+
}
136+
j := n - 1
137+
if k == n+1 {
138+
arr[j] = 0
139+
i, j = i-1, j-1
140+
}
141+
for j >= 0 {
142+
arr[j] = arr[i]
143+
if arr[i] == 0 {
144+
j--
145+
arr[j] = arr[i]
146+
}
147+
i, j = i-1, j-1
148+
}
149+
}
50150
```
51151

52152
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
void duplicateZeros(vector<int>& arr) {
4+
int n = arr.size();
5+
int i = -1, k = 0;
6+
while (k < n)
7+
{
8+
++i;
9+
k += arr[i] ? 1 : 2;
10+
}
11+
int j = n - 1;
12+
if (k == n + 1)
13+
{
14+
arr[j--] = 0;
15+
--i;
16+
}
17+
while (~j)
18+
{
19+
arr[j] = arr[i];
20+
if (arr[i] == 0) arr[--j] = arr[i];
21+
--i;
22+
--j;
23+
}
24+
}
25+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func duplicateZeros(arr []int) {
2+
n := len(arr)
3+
i, k := -1, 0
4+
for k < n {
5+
i, k = i+1, k+1
6+
if arr[i] == 0 {
7+
k++
8+
}
9+
}
10+
j := n - 1
11+
if k == n+1 {
12+
arr[j] = 0
13+
i, j = i-1, j-1
14+
}
15+
for j >= 0 {
16+
arr[j] = arr[i]
17+
if arr[i] == 0 {
18+
j--
19+
arr[j] = arr[i]
20+
}
21+
i, j = i-1, j-1
22+
}
23+
}
Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
class Solution {
22
public void duplicateZeros(int[] arr) {
33
int n = arr.length;
4-
int i = 0, j = 0;
5-
while (j < n) {
6-
if (arr[i] == 0) ++j;
4+
int i = -1, k = 0;
5+
while (k < n) {
76
++i;
8-
++j;
7+
k += arr[i] > 0 ? 1 : 2;
98
}
10-
--i; // i 回到最后一次合法的位置
11-
--j; // j 同理,但 j 仍可能等于 n(例如输入 [0])
12-
while (i >= 0) {
13-
if (j < n) arr[j] = arr[i];
14-
if (arr[i] == 0) arr[--j] = arr[i];
9+
int j = n - 1;
10+
if (k == n + 1) {
11+
arr[j--] = 0;
12+
--i;
13+
}
14+
while (j >= 0) {
15+
arr[j] = arr[i];
16+
if (arr[i] == 0) {
17+
arr[--j] = arr[i];
18+
}
1519
--i;
1620
--j;
1721
}
1822
}
19-
}
23+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def duplicateZeros(self, arr: List[int]) -> None:
3+
"""
4+
Do not return anything, modify arr in-place instead.
5+
"""
6+
n = len(arr)
7+
i, k = -1, 0
8+
while k < n:
9+
i += 1
10+
k += 1 if arr[i] else 2
11+
j = n - 1
12+
if k == n + 1:
13+
arr[j] = 0
14+
i, j = i - 1, j - 1
15+
while ~j:
16+
if arr[i] == 0:
17+
arr[j] = arr[j - 1] = arr[i]
18+
j -= 1
19+
else:
20+
arr[j] = arr[i]
21+
i, j = i - 1, j - 1

0 commit comments

Comments
 (0)