题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部。
思路:用两个指针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==0) return; int* pstart=pdata; int* pend=pdata+length-1; 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&1)==0; } void preorderOddEven(int* pdata,unsigned int length) { preorder(pdata,length,isEven); } void main() { int a[5]={1,2,3,4,5}; int* pdata=a; preorderOddEven(pdata,5); for(int i=0;i<5;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]+" "); } }
时间: 2024-10-05 03:09:13