剑指offer 面试题12 调整数组顺序使奇数位于偶数前面
程序员文章站
2022-07-10 12:16:28
...
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思路分析:
最简单的思路:从头到尾扫描数组,每次遇到一个偶数,则取出该数,将其后的所有数字向前移动1位,则可以将该数放置在数组末尾。每次碰到偶数需要移动O(n)O(n),则总的时间复杂度为O(n2)O(n2)
参考快速排序的思路:维护两个指针,第一个指针start初始指向第一个元素,向后移动;第二个指针end初始指向最后一个元素,向前移动。在两个指针相遇前,start总是在end前面。移动过程中如果遇到start指向的元素为偶数,并且end指向的元素为奇数,则交换两个元素。
代码如下
参考快速排序的思路:维护两个指针,第一个指针start初始指向第一个元素,向后移动;第二个指针end初始指向最后一个元素,向前移动。在两个指针相遇前,start总是在end前面。移动过程中如果遇到start指向的元素为偶数,并且end指向的元素为奇数,则交换两个元素。
代码:
/**
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
* 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分
* key:
* 使用前后两个指针,从头部和尾部相向移动
* 如果第一个指针为偶数,第二个指针为基数,则交换,
* 直到第二个指针移动到第一个指针前面,结束循环;
* @param array
*/
public void reorder(int[] array) {
if(array == null)
return;
int start = 0;
int end = array.length - 1;
while(start < end) {
while(start < end && isEven(array[start]))
start++;
while(start < end && !isEven(array[end]))
end--;
// 交换
if(start < end) {
swap(array, start, end);
}
}
}
// 判断是否是偶数
public boolean isEven(int x) {
return (x & 1) == 0 ? true : false;
}
// 交换数组元素
public void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
推荐阅读
-
剑指offer:调整数组顺序使奇数位于偶数前面
-
剑指offer_数组_调整数组顺序使奇数位于偶数前面
-
剑指offer 12、13:数值的整数次方、调整数组顺序使奇数位于偶数前面
-
剑指Offer_编程题_调整数组顺序使奇数位于偶数前面
-
剑指offer - 12.调整数组顺序使奇数位于偶数前面
-
剑指offer 12 --调整数组顺序,使奇数位于偶数前面
-
调整数组顺序使奇数位于偶数前面 - 牛客剑指offer 12
-
JavaScript版《剑指offer》刷题(12)调整数组顺序使奇数位于偶数前面
-
剑指offer 面试题12 调整数组顺序使奇数位于偶数前面
-
剑指offer_12调整数组使奇数位于偶数的前面(Java版)