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


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

    思路:用两个指针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]+" ");
    
        }
    }
  • 相关阅读:
    python实现读取并显示图片的两种方法
    如何在jupyter中安装R
    FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证
    FPGA设计千兆以太网MAC(2)——以太网协议及设计规划
    FIFO深度计算
    【不定期更新】FPGA/IC岗位常见笔试面试题总结(基础知识)
    【原创】建立与保持时间裕量详细分析
    利用ZYNQ SOC快速打开算法验证通路(6)——利用AXI总线实时配置sysGen子系统
    【转载】泰勒展开式
    利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
  • 原文地址:https://www.cnblogs.com/hupp/p/4569364.html
Copyright © 2020-2023  润新知