【剑指offer】13:调整数组顺序使奇数位于偶数前面
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
例如:输入 [1,2,3,4] 输出 [1,3,2,4]
解题思路:
首先,如果不考虑奇数和偶数的相对位置,那么我们有一种双指针解法来求解,类似于快排,维护两个指针,第一个指针指向数组的第一个数字,第二个指针指向数组的最后一个数字。第一个指针向后移,第二个指针向前移,如果第一个指针指向偶数,第二个指针指向的是奇数,则交换着两个数字,接着继续移动直到两指针相遇。
上面的方法看似不错,但是对本题不适用,因为本题有相对位置不变的要求,直接交换会导致相对位置改变。因此,我们采用下面的思路来解决本题。
定义一个新的数组,对于array数组进行遍历,将奇数判断出插入新数组,再将偶数判断出插入新数组(此时,奇数已经全部输入到新数组),保证了偶数和偶数之间的相对位置不变。
代码实现
(C实现):
int* reOrderArray(int* array, int arrayLen, int* returnSize ) { // write code here if (arrayLen == 0) return array; // 考虑特殊情况 int * res = (int *)malloc(sizeof(int) * arrayLen); //动态定义数组 int resIndex = 0; //定义新数组的下标 for (int i = 0; i < arrayLen; i++) { //判断奇数 if (array[i] % 2 == 1) { res[resIndex] = array[i]; resIndex++; } } for (int i = 0; i < arrayLen;i++) { //此时,奇数已经全部输入到res数组,判断偶数 if (array[i] % 2 == 0) { res[resIndex] = array[i]; resIndex++; } } *returnSize = arrayLen; return res; }
(JavaScript实现):
function reOrderArray( array ) { // write code here if (array.length == 0) { return array; } var resArray = [], item = []; for (var i = 0; i < array.length; i++) { if (array[i] % 2 == 0) { item.push(array[i]); }else { resArray.push(array[i]); } } return resArray.concat(item); }

浙公网安备 33010602011771号