24
24
25
25
## 解法
26
26
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)$。
50
32
51
33
<!-- tabs:start -->
52
34
@@ -55,15 +37,13 @@ EXCHANGE(n)
55
37
``` python
56
38
class Solution :
57
39
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]
67
47
return nums
68
48
```
69
49
@@ -72,26 +52,20 @@ class Solution:
72
52
``` java
73
53
class Solution {
74
54
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;
80
59
}
81
- if ((nums[q] & 1 ) == 0 ) {
82
- -- q;
83
- continue ;
60
+ while (i < j && nums[j] % 2 == 0 ) {
61
+ -- j;
84
62
}
85
- swap(nums, p, q);
63
+ int t = nums[i];
64
+ nums[i] = nums[j];
65
+ nums[j] = t;
86
66
}
87
67
return nums;
88
68
}
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
- }
95
69
}
96
70
```
97
71
@@ -103,18 +77,18 @@ class Solution {
103
77
* @return {number[]}
104
78
*/
105
79
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++ ;
114
85
}
115
- while (nums[right ] % 2 = == 0 ) {
116
- right -- ;
86
+ while (i < j && nums[j ] % 2 == 0 ) {
87
+ -- j ;
117
88
}
89
+ const t = nums[i];
90
+ nums[i] = nums[j];
91
+ nums[j] = t;
118
92
}
119
93
return nums;
120
94
};
@@ -126,34 +100,55 @@ var exchange = function (nums) {
126
100
class Solution {
127
101
public:
128
102
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 ;
133
107
}
134
- while (left < right && ( nums[ right ] & 1) == 0) {
135
- --right ;
108
+ while (i < j && nums[ j ] % 2 == 0) {
109
+ --j ;
136
110
}
137
- swap(nums[ left ] , nums[ right ] );
111
+ swap(nums[ i ] , nums[ j ] );
138
112
}
139
113
return nums;
140
114
}
141
115
};
142
116
```
143
117
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
+
144
136
### ** TypeScript**
145
137
146
138
``` ts
147
139
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 ;
156
148
}
149
+ const t = nums [i ];
150
+ nums [i ] = nums [j ];
151
+ nums [j ] = t ;
157
152
}
158
153
return nums ;
159
154
}
@@ -186,20 +181,18 @@ impl Solution {
186
181
187
182
``` cs
188
183
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 ;
195
189
}
196
- if (nums [q ] % 2 == 0 ) {
197
- q -= 1 ;
198
- continue ;
190
+ while (i < j && nums [j ] % 2 == 0 ) {
191
+ -- j ;
199
192
}
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 ;
203
196
}
204
197
return nums ;
205
198
}
0 commit comments