剑指offer-第三章高质量的代码(调整数组顺序使得奇数位于偶数的前面)

时间:2021-06-02 15:41:55

题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部。

思路:用两个指针p1和p2,分别指向数组的头和尾部,p1只向后移,p2只向前移。当满足p1<p2这个条件时,可以将p1向后移并找到第一偶数为止,p2向前移直到找到第一个奇数为止,此时如果还满足p1<p2的条件,则交换p1和p2的值。

c++代码:本代码扩展性的体现为:将函数bool (*func) (int)当做参数传人preorder中,而此时要判断数字的奇偶性,可以写一个如上格式所示的函数:bool isEven(int n).

当题目改变,要求将数组中能整除3的数放在前面,其他的数组放在后面的时候,就可以写一个如上格式所示的其他函数。

#include<iostream>
using namespace std;
void preorder(int* pdata,unsigned int length,bool (*func) (int))
{
if(pdata==NULL||length==)
return;
int* pstart=pdata;
int* pend=pdata+length-;
while(pstart<pend)
{
while(pstart<pend&&!func(*pstart))
pstart++;
while(pstart<pend&&func(*pend))
pend--;
if(pstart<pend)
{
int temp=*pstart;
*pstart=*pend;
*pend=temp;
}
} }
bool isEven(int n)
{
return (n&)==;
}
void preorderOddEven(int* pdata,unsigned int length)
{
preorder(pdata,length,isEven);
}
void main()
{
int a[]={,,,,};
int* pdata=a;
preorderOddEven(pdata,);
for(int i=;i<;i++)
cout<<pdata[i]<<" ";
cout<<endl; }

Java代码:体现扩展性的方法是写一个接口,里面放一个抽象方法boolean func(int n),其他具体的题目,都只要实现这个方法即可。

public class PreorderOddEven {
/*
* 将一个数组中的奇数排在偶数的前面
* @param pdata 数组
* @param length 数组的长度
*/
public void preorder(int[] pdata,int length)
{
if(pdata==null||length<=0)
return;
int pstart=0;
int pend=length-1;
while(pstart<pend)
{
while(pstart<pend&&!isEven(pdata[pstart]))
pstart++;
while(pstart<pend&&isEven(pdata[pend]))
pend--;
if(pstart<pend)
{
int temp=pdata[pstart];
pdata[pstart]=pdata[pend];
pdata[pend]=temp;
}
} }
/*
* 判断数组中数字的奇偶性
* @param n 数组中的数字
*/
public boolean isEven(int n) {
return (n&1)==0;
}
public static void main(String[] args)
{
PreorderOddEven poe=new PreorderOddEven();
int[] a={1,2,3,4,5};
poe.preorder(a,a.length);
for(int i=0;i<5;i++)
System.out.print(a[i]+" "); }
}