Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d1d4370

Browse files
committed
feat: add question
1 parent a6e5276 commit d1d4370

File tree

3 files changed

+98
-5
lines changed

3 files changed

+98
-5
lines changed

‎00-code(源代码)/src/com/hi/dhl/algorithms/offer/_21/java/Solution.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,42 @@ public int[] exchange2(int[] nums) {
5050
return nums;
5151
}
5252

53+
/**
54+
* 基数在前面,偶数在后面,且相对位置不变
55+
*
56+
* @return
57+
*/
58+
public int[] exchange3(int[] nums) {
59+
for (int i = 0; i < nums.length; i++) {
60+
if (nums[i] % 2 != 0) continue;
61+
62+
int temp = 0;
63+
int evenIndex = -1;
64+
65+
for (int j = i + 1; j < nums.length; j++) {
66+
if (nums[j] % 2 != 0) {
67+
temp = nums[j];
68+
evenIndex = j;
69+
break;
70+
}
71+
}
72+
73+
for (int k = evenIndex; k > i; k--) {
74+
nums[k] = nums[k - 1];
75+
}
76+
77+
if (temp != 0)
78+
nums[i] = temp;
79+
}
80+
return nums;
81+
}
82+
5383
public static void main(String... agrs) {
5484
Solution sort = new Solution();
55-
int[] nums = new int[]{1, 2, 5, 6};
56-
sort.exchange(nums);
85+
int[] nums = new int[]{1, 6, 3, 2, 5, 4, 7, 8, 9};
86+
sort.exchange3(nums);
5787
for (int item : nums) {
58-
System.out.println(item);
88+
System.out.print(item + ", ");
5989
}
6090
}
6191

‎offer/_sidebar.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
* 多线程
88

9-
<!-- * [阿里-线程交替打印数字](/multi-thread/01-printThread.md)
10-
* [头条-线程交替打印 ABC](/multi-thread/02-printABCThread.md)-->
9+
* [阿里-线程交替打印数字](/multi-thread/01-printThread.md)
10+
* [头条-线程交替打印 ABC](/multi-thread/02-printABCThread.md)
1111
* [多线程-按序打印](/multi-thread/03-print-in-order.md)
1212
* [多线程-交替打印FooBar](/multi-thread/04-print-alternately.md)
1313
* [多线程-打印零与奇偶数](/multi-thread/05-print-zero-even-odd.md)

‎offer/algorithm/21-diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,66 @@ public class Solution {
219219

220220
<!-- tabs:end -->
221221

222+
### 拓展题目
223+
224+
在上面题目中增加一点难度,题目如下:
225+
226+
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分,且相对位置不变
227+
228+
**示例 1:**
229+
230+
```
231+
输入:nums = [1, 6, 3, 2, 5, 4, 7, 8, 9]
232+
输出:[1, 3, 5, 7, 9, 6, 2, 4, 8]
233+
```
234+
235+
这道题目类似于插入排序,我们先看一下插入排序算法
236+
237+
```
238+
void insertSort(int[] nums) {
239+
for (int i = 1; i < nums.length; i++) {
240+
int temp = nums[i];
241+
int j = i - 1;
242+
while (j >= 0 && nums[j] > temp) {
243+
nums[j + 1] = nums[j];
244+
j--;
245+
}
246+
nums[j + 1] = temp;
247+
}
248+
}
249+
```
250+
251+
这道题目重点在于「 奇数位于偶数前面,**且相对位置不变** 」,核心思路如下:
252+
253+
* 遍历数组,记录第一次出现偶数的位置,记为 i
254+
* 接着从上一次偶数位置,继续遍历寻找奇数出现的位置,记录当前下标 j 和元素 temp
255+
* 移动数组 [i+1,j] 范围内的元素,统一向右移动 1 位
256+
* 将元素 temp 放到下标为 i 的位置上
257+
258+
```
259+
public int[] exchange(int[] nums) {
260+
for (int i = 0; i < nums.length; i++) {
261+
if (nums[i] % 2 != 0) continue;
262+
263+
int temp = 0;
264+
int evenIndex = -1;
265+
266+
for (int j = i + 1; j < nums.length; j++) {
267+
if (nums[j] % 2 != 0) {
268+
temp = nums[j];
269+
evenIndex = j;
270+
break;
271+
}
272+
}
273+
274+
for (int k = evenIndex; k > i; k--) {
275+
nums[k] = nums[k - 1];
276+
}
277+
278+
if (temp != 0)
279+
nums[i] = temp;
280+
}
281+
return nums;
282+
}
283+
```
284+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /