更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
T:
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
这道题目,我思考了好久,想过各种解决方案,都是基于在本数组上进行操作,无额外的数组开销,还要考虑线性复杂度。但是最终还是没找到解决方案,只得用额外开辟数组的方式来解决。
我的核心code:
/**
* T: 调整数组顺序使奇数位于偶数前面
*
* 题目描述
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,
* 所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
*
* date: 2015.12.5 18:54
* @author SSS
*
*/
public class Solution {
public void reOrderArray(int [] array) {
if (array == null || array.length == 0) {
return;
}
// 分别开辟奇数和偶数的数组,存储原数组中的数据,保证其相对位置不变
int []oddArr = new int[array.length];
int []evenArr = new int[array.length];
int oddIndex = 0;
int evenIndex = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
evenArr[evenIndex ++] = array[i];
} else {
oddArr[oddIndex ++] = array[i];
}
}
for (int i = 0; i < oddIndex; i++) {
array[i] = oddArr[i];
}
for (int i = 0; i < evenIndex; i++) {
array[oddIndex + i] = evenArr[i];
}
}
}
AC之后,我看了讨论版其他人的解决方案,也没有找到我之前设想的解决方法,虽然很多都是在原有数组上进行操作,没有额外的空间开销,但是时间复杂度也上去了,成了 O ( n 2 ) O(n^2) O(n2),而我的代码的时间复杂度是 O ( n ) O(n) O(n),只不过是用时间换空间的做法。
贴两个别人的解决方式:
-
冒泡排序的修改版:这种方式,感觉还不如不用,只不过用时间换空间,太耗时了。。。
-
插入排序:和前一个方法也差不多,都是 O ( n 2 ) O(n^2) O(n2)
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~