Skip to content

Commit e8a28ab

Browse files
committed
feat: add solutions to lcof problem: No.21
1 parent f8c648f commit e8a28ab

File tree

9 files changed

+105
-169
lines changed

9 files changed

+105
-169
lines changed

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

Lines changed: 61 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626

2727
**方法一:双指针**
2828

29-
定义指针 `i`, `j` 分别指向数组的头部和尾部,`i` 向右移动,`j` 向左移动,当 `i` 指向偶数,`j` 指向奇数时,交换两个指针指向的元素,直到 `i``j` 相遇
29+
我们定义两个指针 $i$ 和 $j$,其中指针 $i$ 指向当前元素,指针 $j$ 指向当前最后一个奇数的下一个位置
3030

31-
时间复杂度 $O(n)$,空间复杂度 $O(1)$。
31+
接下来,我们从左到右遍历数组,当 $nums[i]$ 是奇数时,我们将其与 $nums[j]$ 交换,然后指针 $j$ 向右移动一位。指针 $i$ 每次向右移动一位,直到遍历完整个数组。
32+
33+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 是数组的长度。
3234

3335
<!-- tabs:start -->
3436

@@ -37,13 +39,11 @@
3739
```python
3840
class Solution:
3941
def exchange(self, nums: List[int]) -> List[int]:
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]
42+
j = 0
43+
for i, x in enumerate(nums):
44+
if x & 1:
45+
nums[i], nums[j] = nums[j], nums[i]
46+
j += 1
4747
return nums
4848
```
4949

@@ -52,63 +52,30 @@ class Solution:
5252
```java
5353
class Solution {
5454
public int[] exchange(int[] nums) {
55-
int i = 0, j = nums.length - 1;
56-
while (i < j) {
57-
while (i < j && nums[i] % 2 == 1) {
58-
++i;
59-
}
60-
while (i < j && nums[j] % 2 == 0) {
61-
--j;
55+
int j = 0;
56+
for (int i = 0; i < nums.length; ++i) {
57+
if (nums[i] % 2 == 1) {
58+
int t = nums[i];
59+
nums[i] = nums[j];
60+
nums[j++] = t;
6261
}
63-
int t = nums[i];
64-
nums[i] = nums[j];
65-
nums[j] = t;
6662
}
6763
return nums;
6864
}
6965
}
7066
```
7167

72-
### **JavaScript**
73-
74-
```js
75-
/**
76-
* @param {number[]} nums
77-
* @return {number[]}
78-
*/
79-
var exchange = function (nums) {
80-
let i = 0;
81-
let j = nums.length - 1;
82-
while (i < j) {
83-
while (i < j && nums[i] % 2 == 1) {
84-
i++;
85-
}
86-
while (i < j && nums[j] % 2 == 0) {
87-
--j;
88-
}
89-
const t = nums[i];
90-
nums[i] = nums[j];
91-
nums[j] = t;
92-
}
93-
return nums;
94-
};
95-
```
96-
9768
### **C++**
9869

9970
```cpp
10071
class Solution {
10172
public:
10273
vector<int> exchange(vector<int>& nums) {
103-
int i = 0, j = nums.size() - 1;
104-
while (i < j) {
105-
while (i < j && nums[i] % 2 == 1) {
106-
++i;
74+
int j = 0;
75+
for (int i = 0; i < nums.size(); ++i) {
76+
if (nums[i] & 1) {
77+
swap(nums[i], nums[j++]);
10778
}
108-
while (i < j && nums[j] % 2 == 0) {
109-
--j;
110-
}
111-
swap(nums[i], nums[j]);
11279
}
11380
return nums;
11481
}
@@ -119,36 +86,48 @@ public:
11986
12087
```go
12188
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--
89+
j := 0
90+
for i, x := range nums {
91+
if x&1 == 1 {
92+
nums[i], nums[j] = nums[j], nums[i]
93+
j++
12994
}
130-
nums[i], nums[j] = nums[j], nums[i]
13195
}
13296
return nums
13397
}
13498
```
13599

100+
### **JavaScript**
101+
102+
```js
103+
/**
104+
* @param {number[]} nums
105+
* @return {number[]}
106+
*/
107+
var exchange = function (nums) {
108+
let j = 0;
109+
for (let i = 0; i < nums.length; ++i) {
110+
if (nums[i] & 1) {
111+
const t = nums[i];
112+
nums[i] = nums[j];
113+
nums[j++] = t;
114+
}
115+
}
116+
return nums;
117+
};
118+
```
119+
136120
### **TypeScript**
137121

138122
```ts
139123
function exchange(nums: number[]): number[] {
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;
124+
let j = 0;
125+
for (let i = 0; i < nums.length; ++i) {
126+
if (nums[i] & 1) {
127+
const t = nums[i];
128+
nums[i] = nums[j];
129+
nums[j++] = t;
148130
}
149-
const t = nums[i];
150-
nums[i] = nums[j];
151-
nums[j] = t;
152131
}
153132
return nums;
154133
}
@@ -159,17 +138,11 @@ function exchange(nums: number[]): number[] {
159138
```rust
160139
impl Solution {
161140
pub fn exchange(mut nums: Vec<i32>) -> Vec<i32> {
162-
if nums.len() == 0 {
163-
return nums;
164-
}
165-
let mut l = 0;
166-
let mut r = nums.len() - 1;
167-
while l < r {
168-
if nums[l] % 2 == 0 {
169-
nums.swap(l, r);
170-
r -= 1;
171-
} else {
172-
l += 1;
141+
let mut j = 0;
142+
for i in 0..nums.len() {
143+
if nums[i] % 2 == 1 {
144+
nums.swap(i, j);
145+
j += 1;
173146
}
174147
}
175148
nums
@@ -182,17 +155,13 @@ impl Solution {
182155
```cs
183156
public class Solution {
184157
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;
158+
int j = 0;
159+
for (int i = 0; i < nums.Length; ++i) {
160+
if (nums[i] % 2 == 1) {
161+
int t = nums[i];
162+
nums[i] = nums[j];
163+
nums[j++] = t;
189164
}
190-
while (i < j && nums[j] % 2 == 0) {
191-
--j;
192-
}
193-
int t = nums[i];
194-
nums[i] = nums[j];
195-
nums[j] = t;
196165
}
197166
return nums;
198167
}

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
class Solution {
22
public:
33
vector<int> exchange(vector<int>& nums) {
4-
int i = 0, j = nums.size() - 1;
5-
while (i < j) {
6-
while (i < j && nums[i] % 2 == 1) {
7-
++i;
4+
int j = 0;
5+
for (int i = 0; i < nums.size(); ++i) {
6+
if (nums[i] & 1) {
7+
swap(nums[i], nums[j++]);
88
}
9-
while (i < j && nums[j] % 2 == 0) {
10-
--j;
11-
}
12-
swap(nums[i], nums[j]);
139
}
1410
return nums;
1511
}

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
public class Solution {
22
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;
3+
int j = 0;
4+
for (int i = 0; i < nums.Length; ++i) {
5+
if (nums[i] % 2 == 1) {
6+
int t = nums[i];
7+
nums[i] = nums[j];
8+
nums[j++] = t;
79
}
8-
while (i < j && nums[j] % 2 == 0) {
9-
--j;
10-
}
11-
int t = nums[i];
12-
nums[i] = nums[j];
13-
nums[j] = t;
1410
}
1511
return nums;
1612
}
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
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++
2+
j := 0
3+
for i, x := range nums {
4+
if x&1 == 1 {
5+
nums[i], nums[j] = nums[j], nums[i]
6+
j++
67
}
7-
for i < j && nums[j]%2 == 0 {
8-
j--
9-
}
10-
nums[i], nums[j] = nums[j], nums[i]
118
}
129
return nums
1310
}

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
class Solution {
22
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;
3+
int j = 0;
4+
for (int i = 0; i < nums.length; ++i) {
5+
if (nums[i] % 2 == 1) {
6+
int t = nums[i];
7+
nums[i] = nums[j];
8+
nums[j++] = t;
79
}
8-
while (i < j && nums[j] % 2 == 0) {
9-
--j;
10-
}
11-
int t = nums[i];
12-
nums[i] = nums[j];
13-
nums[j] = t;
1410
}
1511
return nums;
1612
}

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,13 @@
33
* @return {number[]}
44
*/
55
var exchange = function (nums) {
6-
let i = 0;
7-
let j = nums.length - 1;
8-
while (i < j) {
9-
while (i < j && nums[i] % 2 == 1) {
10-
i++;
6+
let j = 0;
7+
for (let i = 0; i < nums.length; ++i) {
8+
if (nums[i] & 1) {
9+
const t = nums[i];
10+
nums[i] = nums[j];
11+
nums[j++] = t;
1112
}
12-
while (i < j && nums[j] % 2 == 0) {
13-
--j;
14-
}
15-
const t = nums[i];
16-
nums[i] = nums[j];
17-
nums[j] = t;
1813
}
1914
return nums;
2015
};
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
class Solution:
22
def exchange(self, nums: List[int]) -> List[int]:
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]
3+
j = 0
4+
for i, x in enumerate(nums):
5+
if x & 1:
6+
nums[i], nums[j] = nums[j], nums[i]
7+
j += 1
108
return nums
Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
impl Solution {
22
pub fn exchange(mut nums: Vec<i32>) -> Vec<i32> {
3-
if nums.len() == 0 {
4-
return nums;
5-
}
6-
let mut l = 0;
7-
let mut r = nums.len() - 1;
8-
while l < r {
9-
if nums[l] % 2 == 0 {
10-
nums.swap(l, r);
11-
r -= 1;
12-
} else {
13-
l += 1;
3+
let mut j = 0;
4+
for i in 0..nums.len() {
5+
if nums[i] % 2 == 1 {
6+
nums.swap(i, j);
7+
j += 1;
148
}
159
}
1610
nums
1711
}
18-
}
12+
}
Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
function exchange(nums: number[]): number[] {
2-
let i = 0;
3-
let j = nums.length - 1;
4-
while (i < j) {
5-
while (i < j && nums[i] % 2 == 1) {
6-
i++;
2+
let j = 0;
3+
for (let i = 0; i < nums.length; ++i) {
4+
if (nums[i] & 1) {
5+
const t = nums[i];
6+
nums[i] = nums[j];
7+
nums[j++] = t;
78
}
8-
while (i < j && nums[j] % 2 == 0) {
9-
--j;
10-
}
11-
const t = nums[i];
12-
nums[i] = nums[j];
13-
nums[j] = t;
149
}
1510
return nums;
1611
}

0 commit comments

Comments
 (0)