Skip to content

Commit c0e3a3c

Browse files
committed
feat: add solutions to lcof problem: No.021
面试题21.调整数组顺序使奇数位于偶数前面
1 parent 709eb23 commit c0e3a3c

File tree

11 files changed

+155
-156
lines changed

11 files changed

+155
-156
lines changed

lcci/02.04.Partition List/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@
4242

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

45-
**方法 1:**
45+
**方法一:拼接链表**
4646

4747
创建两个链表,一个存放小于 `x` 的节点,另一个存放大于等于 `x` 的节点,之后进行拼接即可。
4848

49-
**方法 2:**
49+
**方法二:头插法**
5050

5151
题中指出,**不需要保留节点的相对位置**
5252

lcof/面试题21. 调整数组顺序使奇数位于偶数前面/README.md

+77-84
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,11 @@
2424

2525
## 解法
2626

27-
**双指针**
28-
29-
定义两个指针,分别指向数组左右边缘。
30-
31-
- 查看左指针所指向的元素。
32-
- 若为 **奇数**,则左指针往右移动。
33-
- 若为 **偶数**,则与右指针交换元素,并将右指针往左移动。
34-
- 重复该过程,直到左指针超过右指针。
35-
36-
```txt
37-
EXCHANGE(n)
38-
l = 0
39-
r = n.length - 1
40-
while l < r
41-
if n[l] % 2 == 0
42-
t = n[l]
43-
n[l] = n[r]
44-
n[r] = t
45-
r--
46-
else
47-
l++
48-
return n
49-
```
27+
**方法一:双指针**
28+
29+
定义指针 `i`, `j` 分别指向数组的头部和尾部,`i` 向右移动,`j` 向左移动,当 `i` 指向偶数,`j` 指向奇数时,交换两个指针指向的元素,直到 `i``j` 相遇。
30+
31+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。
5032

5133
<!-- tabs:start -->
5234

@@ -55,15 +37,13 @@ EXCHANGE(n)
5537
```python
5638
class Solution:
5739
def exchange(self, nums: List[int]) -> List[int]:
58-
p, q = 0, len(nums) - 1
59-
while p < q:
60-
if nums[p] & 1 == 1:
61-
p += 1
62-
continue
63-
if nums[q] & 1 == 0:
64-
q -= 1
65-
continue
66-
nums[p], nums[q] = nums[q], nums[p]
40+
i, j = 0, len(nums) - 1
41+
while i < j:
42+
while i < j and nums[i] & 1:
43+
i += 1
44+
while i < j and (nums[j] & 1) == 0:
45+
j -= 1
46+
nums[i], nums[j] = nums[j], nums[i]
6747
return nums
6848
```
6949

@@ -72,26 +52,20 @@ class Solution:
7252
```java
7353
class Solution {
7454
public int[] exchange(int[] nums) {
75-
int p = 0, q = nums.length - 1;
76-
while (p < q) {
77-
if ((nums[p] & 1) == 1) {
78-
++p;
79-
continue;
55+
int i = 0, j = nums.length - 1;
56+
while (i < j) {
57+
while (i < j && nums[i] % 2 == 1) {
58+
++i;
8059
}
81-
if ((nums[q] & 1) == 0) {
82-
--q;
83-
continue;
60+
while (i < j && nums[j] % 2 == 0) {
61+
--j;
8462
}
85-
swap(nums, p, q);
63+
int t = nums[i];
64+
nums[i] = nums[j];
65+
nums[j] = t;
8666
}
8767
return nums;
8868
}
89-
90-
private void swap(int[] nums, int p, int q) {
91-
int t = nums[p];
92-
nums[p] = nums[q];
93-
nums[q] = t;
94-
}
9569
}
9670
```
9771

@@ -103,18 +77,18 @@ class Solution {
10377
* @return {number[]}
10478
*/
10579
var exchange = function (nums) {
106-
let left = 0;
107-
let right = nums.length - 1;
108-
while (left < right) {
109-
let c = nums[left];
110-
nums[left] = nums[right];
111-
nums[right] = c;
112-
while (nums[left] % 2) {
113-
left++;
80+
let i = 0;
81+
let j = nums.length - 1;
82+
while (i < j) {
83+
while (i < j && nums[i] % 2 == 1) {
84+
i++;
11485
}
115-
while (nums[right] % 2 === 0) {
116-
right--;
86+
while (i < j && nums[j] % 2 == 0) {
87+
--j;
11788
}
89+
const t = nums[i];
90+
nums[i] = nums[j];
91+
nums[j] = t;
11892
}
11993
return nums;
12094
};
@@ -126,34 +100,55 @@ var exchange = function (nums) {
126100
class Solution {
127101
public:
128102
vector<int> exchange(vector<int>& nums) {
129-
int left = 0, right = nums.size() - 1;
130-
while (left < right) {
131-
while (left < right && (nums[left] & 1) == 1) {
132-
++left;
103+
int i = 0, j = nums.size() - 1;
104+
while (i < j) {
105+
while (i < j && nums[i] % 2 == 1) {
106+
++i;
133107
}
134-
while (left < right && (nums[right] & 1) == 0) {
135-
--right;
108+
while (i < j && nums[j] % 2 == 0) {
109+
--j;
136110
}
137-
swap(nums[left], nums[right]);
111+
swap(nums[i], nums[j]);
138112
}
139113
return nums;
140114
}
141115
};
142116
```
143117
118+
### **Go**
119+
120+
```go
121+
func exchange(nums []int) []int {
122+
i, j := 0, len(nums)-1
123+
for i < j {
124+
for i < j && nums[i]%2 == 1 {
125+
i++
126+
}
127+
for i < j && nums[j]%2 == 0 {
128+
j--
129+
}
130+
nums[i], nums[j] = nums[j], nums[i]
131+
}
132+
return nums
133+
}
134+
```
135+
144136
### **TypeScript**
145137

146138
```ts
147139
function exchange(nums: number[]): number[] {
148-
let l = 0;
149-
let r = nums.length - 1;
150-
while (l < r) {
151-
if (nums[l] % 2 === 0) {
152-
[nums[l], nums[r]] = [nums[r], nums[l]];
153-
r--;
154-
} else {
155-
l++;
140+
let i = 0;
141+
let j = nums.length - 1;
142+
while (i < j) {
143+
while (i < j && nums[i] % 2 == 1) {
144+
i++;
145+
}
146+
while (i < j && nums[j] % 2 == 0) {
147+
--j;
156148
}
149+
const t = nums[i];
150+
nums[i] = nums[j];
151+
nums[j] = t;
157152
}
158153
return nums;
159154
}
@@ -186,20 +181,18 @@ impl Solution {
186181

187182
```cs
188183
public class Solution {
189-
public int[] Excahnge(int[] nums) {
190-
int p = 0, q = nums.Length - 1;
191-
while (p < q) {
192-
if (nums[p] % 2 == 1) {
193-
p += 1;
194-
continue;
184+
public int[] Exchange(int[] nums) {
185+
int i = 0, j = nums.Length - 1;
186+
while (i < j) {
187+
while (i < j && nums[i] % 2 == 1) {
188+
++i;
195189
}
196-
if (nums[q] % 2 == 0) {
197-
q -= 1;
198-
continue;
190+
while (i < j && nums[j] % 2 == 0) {
191+
--j;
199192
}
200-
nums[p] = nums[p] + nums[q];
201-
nums[q] = nums[p] - nums[q];
202-
nums[p] = nums[p] - nums[q];
193+
int t = nums[i];
194+
nums[i] = nums[j];
195+
nums[j] = t;
203196
}
204197
return nums;
205198
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
class Solution {
22
public:
33
vector<int> exchange(vector<int>& nums) {
4-
int left = 0, right = nums.size() - 1;
5-
while (left < right) {
6-
while (left < right && (nums[left] & 1) == 1) {
7-
++left;
4+
int i = 0, j = nums.size() - 1;
5+
while (i < j) {
6+
while (i < j && nums[i] % 2 == 1) {
7+
++i;
88
}
9-
while (left < right && (nums[right] & 1) == 0) {
10-
--right;
9+
while (i < j && nums[j] % 2 == 0) {
10+
--j;
1111
}
12-
swap(nums[left], nums[right]);
12+
swap(nums[i], nums[j]);
1313
}
1414
return nums;
1515
}
16-
};
16+
};

lcof/面试题21. 调整数组顺序使奇数位于偶数前面/Solution.cs

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
public class Solution {
2-
public int[] Excahnge(int[] nums) {
3-
int p = 0, q = nums.Length - 1;
4-
while (p < q) {
5-
if (nums[p] % 2 == 1) {
6-
p += 1;
7-
continue;
2+
public int[] Exchange(int[] nums) {
3+
int i = 0, j = nums.Length - 1;
4+
while (i < j) {
5+
while (i < j && nums[i] % 2 == 1) {
6+
++i;
87
}
9-
if (nums[q] % 2 == 0) {
10-
q -= 1;
11-
continue;
8+
while (i < j && nums[j] % 2 == 0) {
9+
--j;
1210
}
13-
nums[p] = nums[p] + nums[q];
14-
nums[q] = nums[p] - nums[q];
15-
nums[p] = nums[p] - nums[q];
11+
int t = nums[i];
12+
nums[i] = nums[j];
13+
nums[j] = t;
1614
}
1715
return nums;
1816
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
func exchange(nums []int) []int {
2+
i, j := 0, len(nums)-1
3+
for i < j {
4+
for i < j && nums[i]%2 == 1 {
5+
i++
6+
}
7+
for i < j && nums[j]%2 == 0 {
8+
j--
9+
}
10+
nums[i], nums[j] = nums[j], nums[i]
11+
}
12+
return nums
13+
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
class Solution {
22
public int[] exchange(int[] nums) {
3-
int p = 0, q = nums.length - 1;
4-
while (p < q) {
5-
if ((nums[p] & 1) == 1) {
6-
++p;
7-
continue;
3+
int i = 0, j = nums.length - 1;
4+
while (i < j) {
5+
while (i < j && nums[i] % 2 == 1) {
6+
++i;
87
}
9-
if ((nums[q] & 1) == 0) {
10-
--q;
11-
continue;
8+
while (i < j && nums[j] % 2 == 0) {
9+
--j;
1210
}
13-
swap(nums, p, q);
11+
int t = nums[i];
12+
nums[i] = nums[j];
13+
nums[j] = t;
1414
}
1515
return nums;
1616
}
17-
18-
private void swap(int[] nums, int p, int q) {
19-
int t = nums[p];
20-
nums[p] = nums[q];
21-
nums[q] = t;
22-
}
2317
}

lcof/面试题21. 调整数组顺序使奇数位于偶数前面/Solution.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
* @return {number[]}
44
*/
55
var exchange = function (nums) {
6-
let left = 0;
7-
let right = nums.length - 1;
8-
while (left < right) {
9-
let c = nums[left];
10-
nums[left] = nums[right];
11-
nums[right] = c;
12-
while (nums[left] % 2) {
13-
left++;
6+
let i = 0;
7+
let j = nums.length - 1;
8+
while (i < j) {
9+
while (i < j && nums[i] % 2 == 1) {
10+
i++;
1411
}
15-
while (nums[right] % 2 === 0) {
16-
right--;
12+
while (i < j && nums[j] % 2 == 0) {
13+
--j;
1714
}
15+
const t = nums[i];
16+
nums[i] = nums[j];
17+
nums[j] = t;
1818
}
1919
return nums;
2020
};
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
class Solution:
22
def exchange(self, nums: List[int]) -> List[int]:
3-
p, q = 0, len(nums) - 1
4-
while p < q:
5-
if nums[p] & 1 == 1:
6-
p += 1
7-
continue
8-
if nums[q] & 1 == 0:
9-
q -= 1
10-
continue
11-
nums[p], nums[q] = nums[q], nums[p]
3+
i, j = 0, len(nums) - 1
4+
while i < j:
5+
while i < j and nums[i] & 1:
6+
i += 1
7+
while i < j and (nums[j] & 1) == 0:
8+
j -= 1
9+
nums[i], nums[j] = nums[j], nums[i]
1210
return nums

0 commit comments

Comments
 (0)