题目:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
如果去掉约束条件:并保证奇数和奇数,偶数和偶数之间的相对位置不变?
思路:
如果要保证奇数和奇数,偶数和偶数之间的相对位置不变,那么需要开辟新的空间来保存奇数和偶数,方法有两种:
1、开辟一个新数组,遍历第一遍原数组,将奇数依次写入新数组,遍历第二遍原数组,将偶数依次写入新数组,返回新数组;
2、开辟两个数组,遍历一遍原数组,分别将奇数和偶数存入两个新数组,再将奇数数组和偶数数组分别写入原数组,返回原数组;
如果无需保证奇数和奇数,偶数和偶数之间的相对位置不变,那么可以通过前后遍历,奇偶对换的方法来实现:
维护两个指针,分别指向数组的首尾,然后一个向后一个向前,在两个指针相遇之前,如果第一个指针指向偶数,而第二个指针指向奇数,那么就交换这两个数。(无需开辟新空间)
类似题目:
- 将题目改成将数组分成两部分,所有负数在非负数前面;
- 将题目改成将数组分成两部分,能被3整除的在不能被3整除的前面;
为了让代码的扩展性更强,可以将这些判断条件单独写成一个函数接口,而主代码框架保持不变。
代码:
#include <iostream> #include <vector> using namespace std; // not changed the relative position void ReOrderOddEven_1(vector<int> &array){ if(array.size()<=0) return; vector<int> odds; vector<int> evens; unsigned int i; for(i=0;i<array.size();i++){ if((array[i]&0x1)!=0) odds.push_back(array[i]); else evens.push_back(array[i]); } for(i=0;i<odds.size();i++) array[i]=odds[i]; int k=i; for(i=0;i<evens.size();i++) array[k++]=evens[i]; } // changed the relative position void ReOrderOddEven_2(int *pdata,unsigned int length){ if(pdata==NULL || length<=0) return; int *pBegin=pdata; int *pEnd=pdata+length-1; while(pBegin<pEnd){ while(pBegin<pEnd && (*pBegin&0x1)!=0) pBegin++; while(pBegin<pEnd && (*pEnd&0x1)==0) pEnd--; if(pBegin<pEnd){ int tmp=*pBegin; *pBegin=*pEnd; *pEnd=tmp; } } } bool isEven(int n){ return (n&1)==0; } // more expansible void ReOrderOddEven_3(int *pdata,unsigned int length,bool (*func)(int)){ if(pdata==NULL || length<=0) return; int *pBegin=pdata; int *pEnd=pdata+length-1; while(pBegin<pEnd){ while(pBegin<pEnd && !func(*pBegin)) pBegin++; while(pBegin<pEnd && func(*pEnd)) pEnd--; if(pBegin<pEnd){ int tmp=*pBegin; *pBegin=*pEnd; *pEnd=tmp; } } } int main() { int A[]={1,2,3,4,5,6,7,8,9}; int length=sizeof(A)/sizeof(A[0]); ReOrderOddEven_2(A,length); for(int i=0;i<length;i++) cout<<A[i]<<" "; cout<<endl; int B[]={1,2,3,4,5,6,7,8,9}; vector<int> C(B,B+length); ReOrderOddEven_1(C); for(int i=0;i<length;i++) cout<<C[i]<<" "; cout<<endl; ReOrderOddEven_3(B,length,isEven); for(int i=0;i<length;i++) cout<<B[i]<<" "; cout<<endl; return 0; }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/beb5aa231adc45b2a5dcc5b62c93f593?rp=1
AC代码:
class Solution { public: void reOrderArray(vector<int> &array) { if(array.size()<=0) return; vector<int> odds,evens; unsigned int i; for(i=0;i<array.size();i++){ if((array[i]&0x1)!=0) odds.push_back(array[i]); if((array[i]&0x1)==0) evens.push_back(array[i]); } for(i=0;i<odds.size();i++) array[i]=odds[i]; int k=i; for(i=0;i<evens.size();i++) array[k++]=evens[i]; } };
时间: 2024-10-10 20:08:08