算法题:任意一个整型数组,奇偶分离
前言
前些日子,有个朋友问我一道题目,然后并没有在意。今天在看面试题目时,又看到了这道题目,于是乎,决定做一下。
题目:给定任意一个整型数组,不创建新的数组将奇偶分离
分析
假设我们现在是将该数组进行奇偶分离,前面放奇数,后面放偶数。
简单分析:从第一个数字开始,奇数的话,不动,偶数的话,将其放在最后面。
这样子可以做,不过比较麻烦,可以改进为,两头往中间找,从左往右找到的偶数,与从右往左找的奇数交换位置。
代码实现
package algorithm;
import java.util.Arrays;
/**
* @Description: 给定任意一个整型数组,不创建新的数组将奇偶分离
* 例如:
* 输入数组 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
* 输出数组 [1, 9, 3, 7, 5, 6, 4, 8, 2, 10]
* @author: HochenChong
* @date: 2018-08-13
* @version v0.1
*/
public class OddEvenSeparation {
/**
* 将一个整型数组,奇偶分离,前面放奇数,后面放偶数
* @param arrays
* @return
*/
public static int[] oddEvenSeparation(int[] arrays) {
// 两头同时查找
int first_index;
int last_index = arrays.length - 1;
for (first_index = 0; first_index < last_index; first_index++) {
// 当 arrays[first] 为偶数,arrays[last] 为奇数时,两者交换位置,并且 last 减 1
if (arrays[first_index] % 2 == 0 && arrays[last_index] % 2 == 1) {
int temp = arrays[first_index];
arrays[first_index] = arrays[last_index];
arrays[last_index] = temp;
last_index --;
} else if (arrays[first_index] % 2 == 0 && arrays[last_index] % 2 == 0) {
// 当 arrays[first] 为偶数,arrays[last] 为偶数时,并且 last 减 1,first 减 1
first_index--;
last_index--;
} else if (arrays[first_index] % 2 == 1 && arrays[last_index] % 2 == 0) {
// 当 arrays[first] 为奇数,arrays[last] 为偶数时,并且 last 减 1
last_index--;
}
// 当 arrays[first] 为奇数,arrays[last] 为奇数时,不做任何处理
}
return arrays;
}
}
单元测试
package algorithm;
import org.junit.Assert;
import org.junit.Test;
/**
* @Description: OddEvenSeparation.java 的测试类
* @author: HochenChong
* @date: 2018-08-13
* @version v0.1
*/
public class OddEvenSeparationTest {
@Test
public void testOddEvenSeparation() {
int[] arrays1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arrays2 = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int[] arrays3 = { 10, 1, 9, 2, 8, 3, 7, 4, 6, 5};
Assert.assertArrayEquals(new int[] {1, 9, 3, 7, 5, 6, 4, 8, 2, 10},
OddEvenSeparation.oddEvenSeparation(arrays1));
Assert.assertArrayEquals(new int[] {1, 9, 3, 7, 5, 6, 4, 8, 2, 10},
OddEvenSeparation.oddEvenSeparation(arrays2));
Assert.assertArrayEquals(new int[] {5, 1, 9, 7, 3, 8, 2, 4, 6, 10},
OddEvenSeparation.oddEvenSeparation(arrays3));
}
}
Junit 通过,ok,问题解决。
后记
偶尔做一下这些题目还是蛮有意思的。这道题,还可以继续,例如,除了奇偶分离之外,奇数从小到大排序,偶数从小到大排序。可以尝试去做一下。
在实践中成长!
HochenChong
2018-8-13