Skip to content

Commit ff87889

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

File tree

4 files changed

+182
-1
lines changed

4 files changed

+182
-1
lines changed

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

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,21 @@
4141

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

44-
**方法一:双指针**
44+
由于是原地修改,所以不能直接将 0 的后一位直接修改为 0,这会丢失元素数据。
45+
46+
若选择插入,则会导致元素位置调整,时间复杂度偏高。
47+
48+
**方法一:模拟**
49+
50+
开辟一个等长数组,将 `arr` 复刻一份,再进行简单模拟即可。
51+
52+
- 时间复杂度:$O(n)$。
53+
- 空间复杂度:$O(n)$。
54+
55+
**方法二:双指针**
56+
57+
- 时间复杂度:$O(n)$。
58+
- 空间复杂度:$O(1)$。
4559

4660
<!-- tabs:start -->
4761

@@ -161,6 +175,65 @@ func duplicateZeros(arr []int) {
161175
}
162176
```
163177

178+
### **C**
179+
180+
```c
181+
void duplicateZeros(int* arr, int arrSize){
182+
int i = 0;
183+
int j = 0;
184+
while (j < arrSize) {
185+
if (arr[i] == 0) {
186+
j++;
187+
}
188+
i++;
189+
j++;
190+
}
191+
i--;
192+
j--;
193+
while (i >= 0) {
194+
if (arr[i] == 0) {
195+
if (j < arrSize) {
196+
arr[j] = arr[i];
197+
}
198+
j--;
199+
}
200+
arr[j] = arr[i];
201+
i--;
202+
j--;
203+
}
204+
}
205+
```
206+
207+
### **Rust**
208+
209+
```rust
210+
impl Solution {
211+
pub fn duplicate_zeros(arr: &mut Vec<i32>) {
212+
let n = arr.len();
213+
let mut i = 0;
214+
let mut j = 0;
215+
while j < n {
216+
if arr[i] == 0 {
217+
j += 1;
218+
}
219+
j += 1;
220+
i += 1;
221+
}
222+
while i > 0 {
223+
if arr[i - 1] == 0 {
224+
if j <= n {
225+
arr[j - 1] = arr[i - 1];
226+
}
227+
j -= 1;
228+
}
229+
arr[j - 1] = arr[i - 1];
230+
i -= 1;
231+
j -= 1;
232+
}
233+
}
234+
}
235+
```
236+
164237
### **...**
165238

166239
```

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,65 @@ func duplicateZeros(arr []int) {
149149
}
150150
```
151151

152+
### **C**
153+
154+
```c
155+
void duplicateZeros(int* arr, int arrSize){
156+
int i = 0;
157+
int j = 0;
158+
while (j < arrSize) {
159+
if (arr[i] == 0) {
160+
j++;
161+
}
162+
i++;
163+
j++;
164+
}
165+
i--;
166+
j--;
167+
while (i >= 0) {
168+
if (arr[i] == 0) {
169+
if (j < arrSize) {
170+
arr[j] = arr[i];
171+
}
172+
j--;
173+
}
174+
arr[j] = arr[i];
175+
i--;
176+
j--;
177+
}
178+
}
179+
```
180+
181+
### **Rust**
182+
183+
```rust
184+
impl Solution {
185+
pub fn duplicate_zeros(arr: &mut Vec<i32>) {
186+
let n = arr.len();
187+
let mut i = 0;
188+
let mut j = 0;
189+
while j < n {
190+
if arr[i] == 0 {
191+
j += 1;
192+
}
193+
j += 1;
194+
i += 1;
195+
}
196+
while i > 0 {
197+
if arr[i - 1] == 0 {
198+
if j <= n {
199+
arr[j - 1] = arr[i - 1];
200+
}
201+
j -= 1;
202+
}
203+
arr[j - 1] = arr[i - 1];
204+
i -= 1;
205+
j -= 1;
206+
}
207+
}
208+
}
209+
```
210+
152211
### **...**
153212

154213
```
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
void duplicateZeros(int* arr, int arrSize){
2+
int i = 0;
3+
int j = 0;
4+
while (j < arrSize) {
5+
if (arr[i] == 0) {
6+
j++;
7+
}
8+
i++;
9+
j++;
10+
}
11+
i--;
12+
j--;
13+
while (i >= 0) {
14+
if (arr[i] == 0) {
15+
if (j < arrSize) {
16+
arr[j] = arr[i];
17+
}
18+
j--;
19+
}
20+
arr[j] = arr[i];
21+
i--;
22+
j--;
23+
}
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
impl Solution {
2+
pub fn duplicate_zeros(arr: &mut Vec<i32>) {
3+
let n = arr.len();
4+
let mut i = 0;
5+
let mut j = 0;
6+
while j < n {
7+
if arr[i] == 0 {
8+
j += 1;
9+
}
10+
j += 1;
11+
i += 1;
12+
}
13+
while i > 0 {
14+
if arr[i - 1] == 0 {
15+
if j <= n {
16+
arr[j - 1] = arr[i - 1];
17+
}
18+
j -= 1;
19+
}
20+
arr[j - 1] = arr[i - 1];
21+
i -= 1;
22+
j -= 1;
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)