【剑指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);
}

 

posted @ 2021-04-18 21:46  zhang十六  阅读(65)  评论(0)    收藏  举报