首页 > 学院 > 开发设计 > 正文

【剑指offer】面试题14:调整数组顺序使奇数位于偶数前面

2019-11-06 07:24:53
字体:
来源:转载
供稿:网友
//调整数组顺序使奇数位于偶数前面#include<iostream>using namespace std;//基本解法void ReorderOddEven(int *pData, int length){ if (pData == NULL || length <= 0) { return; } //定义两个指针 int *pBegin = pData; int *pEnd = pData + length - 1; while (pBegin < pEnd) { while ((pBegin<pEnd)&&(*pBegin & 1))//注意添加另外一个限制条件(pBegin<pEnd) { ++pBegin; } while ((pBegin<pEnd)&&((*pEnd & 1) == 0)) { --pEnd; } if (pBegin < pEnd) { int temp = *pBegin; *pBegin = *pEnd; *pEnd = temp; } }}

考虑可扩展性的解法:

如果题目改为:数组按照大小分为两部分,所有负数都在非负数的前面。 或者改为分为两部分,能被3整除的放到前面,不能被整除的放到后面。 该如何解决: 大的逻辑框架不用改变,把判断的标准改为一个函数指针。 可以把整个函数分为两个部分:一是判断数字是在数组中的前半段还是后半段。2.拆分数组的操作

bool isEven(int n)//判断是否为偶数{ return (n & 1) == 0;}void ReorderOddEven(int *pData, 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<pEnd) { ++pBegin; } while ((pBegin<pEnd) && func(*pBegin))//函数指针可以直接当函数名进行使用 { --pEnd; } if (pBegin < pEnd) { int temp = *pBegin; *pBegin = *pEnd; *pEnd = temp; } }}

测试函数:

int main(){ int number[] = {5,2,6,7,8,9,1}; ReorderOddEven(number, 7); for (int i = 0; i < 7; ++i) { PRintf("%d ", number[i]); } printf("/n"); return 0;}

这里写图片描述


上一篇:函数指针

下一篇:程序异常分析指南

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表