剑指Offer_面试题14_调整数组顺序使奇数位于偶数前面

来源:互联网 发布:javascript数组赋值 编辑:程序博客网 时间:2024/05/16 06:52

题目描述(剑指offer原版)

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
分析:两个指针,p指向头,q指向尾,p向后遍历到偶数,q向前遍历到奇数,交换值,继续++p,--q直到p<q不成立。考虑到扩展性,可以把判断奇偶的功能封装成返回bool的函数,作为参数传入排序函数中。
#include <stdio.h>#include <iostream>//判断函数,本题中为判断是不是奇数bool judge(int a){return (a & 1);}//使奇数位于前半部分,偶数位于后半部分void reorderArray(int *array, unsigned int length, bool (*func)(int)){if (array == NULL || length <= 1) return;int *p = array;                 //头指针int *q = array + length - 1;    //尾指针while (p < q){//p自增直到p指向偶数while (p < q && !func(*p))++p;//q自减直到q指向奇数while (p < q && func(*q))--q;//奇偶交换if (p < q){int temp = *p;*p = *q;*q = temp;}}}void printArray(int *a, unsigned int length){if (a == NULL || length == 0) return;for (unsigned int i = 0; i < length; ++i){printf("%d ", a[i]);}printf("\n");}int main(){int a[] = {1,2,3,4,5,6,7,8,9,10};printArray(a, 10);reorderArray(a, 10, judge);    //judge作为参数传入printArray(a, 10);getchar();return 0;}

题目描述(牛客网)

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。(也就是说“稳定排序”)
解法一:空间换时间。真正面试的时候得问清楚面试官具体的要求
class Solution {public:    void reOrderArray(vector<int> &array) {        int length = array.size();        if(length == 0) return;        vector<int> a;        vector<int> b;        for(int i = 0; i < length; ++i)        {            if(array[i] & 1)                a.push_back(array[i]);            else                b.push_back(array[i]);        }        int count = 0;        for(auto e : a)        {            array[count++] = e;        }        for(auto e : b)        {            array[count++] = e;        }    }};

解法二:STL algorithm.h sort 排序思想,由于要求相对位置不变,因此采用stable_sort稳定排序
class Solution {public:    void reOrderArray(vector<int> &array) {        stable_sort(array.begin(), array.end(), compare);    }         static bool compare(int a, int b)    {        if((a & 1) == 1 && (b & 1) == 0)            return true;        else            return false;    }};





阅读全文
0 0