/*
* 题目
* 输入一个数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分
* 偶数位于数组的后半部分
* 同时考虑代码的可扩展行
*/
#include <iostream>
using namespace std;
// 不考虑可扩展性
void ReorderOddEven(int* pData, unsigned int length) {
if(pData == NULL || length == 0)
return;
int* pBegin = pData;
int* pEnd = pData + length - 1;
while(pBegin < pEnd && (*pBegin & 0x1) != 0)
pBegin ++;
while(pBegin < pEnd && (*pEnd & 0x1) == 0)
pEnd--;
if(pBegin < pEnd) {
int tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
}
}
// 当题目要求改成,将数组分为这样的两部分:负数在非负数的前面,或者能被3整除的放在不能被3整除的前面
// 考虑将判断条件作为函数指针传入
void Reorder(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;
}
}
}
bool isEven(int n) {
return (n & 1) == 0;
}
bool isPositive(int n) {
return n >= 0;
}
int main(int argc, char const *argv[]) {
int pData[] = {1,2,3,4,5};
Reorder(pData, 5, isEven);
int length = 5;
for(int i = 0; i < length; i++)
cout << pData[i] << " ";
cout << endl;
int pData1[] = {2,-3,-4,3,0};
Reorder(pData1, 5, isPositive);
for(int i = 0; i < length; i++)
cout << pData1[i] << " ";
cout << endl;
return 0;
}
剑指offer(面试题21):根据给定条件划分数组
最新推荐文章于 2022-08-06 21:09:03 发布