zoukankan      html  css  js  c++  java
  • (剑指Offer)面试题14:调整数组顺序使奇数位于偶数前面

    题目:

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    如果去掉约束条件:并保证奇数和奇数,偶数和偶数之间的相对位置不变?

    思路:

    如果要保证奇数和奇数,偶数和偶数之间的相对位置不变,那么需要开辟新的空间来保存奇数和偶数,方法有两种:

    1、开辟一个新数组,遍历第一遍原数组,将奇数依次写入新数组,遍历第二遍原数组,将偶数依次写入新数组,返回新数组;

    2、开辟两个数组,遍历一遍原数组,分别将奇数和偶数存入两个新数组,再将奇数数组和偶数数组分别写入原数组,返回原数组;

    如果无需保证奇数和奇数,偶数和偶数之间的相对位置不变,那么可以通过前后遍历,奇偶对换的方法来实现:

    维护两个指针,分别指向数组的首尾,然后一个向后一个向前,在两个指针相遇之前,如果第一个指针指向偶数,而第二个指针指向奇数,那么就交换这两个数。(无需开辟新空间)

    类似题目:

    • 将题目改成将数组分成两部分,所有负数在非负数前面;
    • 将题目改成将数组分成两部分,能被3整除的在不能被3整除的前面;

    为了让代码的扩展性更强,可以将这些判断条件单独写成一个函数接口,而主代码框架保持不变。

    代码:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    // not changed the relative position
    void ReOrderOddEven_1(vector<int> &array){
        if(array.size()<=0)
            return;
        vector<int> odds;
        vector<int> evens;
        unsigned int i;
        for(i=0;i<array.size();i++){
            if((array[i]&0x1)!=0)
                odds.push_back(array[i]);
            else
                evens.push_back(array[i]);
        }
        for(i=0;i<odds.size();i++)
            array[i]=odds[i];
        int k=i;
        for(i=0;i<evens.size();i++)
            array[k++]=evens[i];
    }
    
    // changed the relative position
    void ReOrderOddEven_2(int *pdata,unsigned int length){
        if(pdata==NULL || length<=0)
            return;
        int *pBegin=pdata;
        int *pEnd=pdata+length-1;
    
        while(pBegin<pEnd){
            while(pBegin<pEnd && (*pBegin&0x1)!=0)
                pBegin++;
            while(pBegin<pEnd && (*pEnd&0x1)==0)
                pEnd--;
            if(pBegin<pEnd){
                int tmp=*pBegin;
                *pBegin=*pEnd;
                *pEnd=tmp;
            }
        }
    }
    
    bool isEven(int n){
        return (n&1)==0;
    }
    
    // more expansible
    void ReOrderOddEven_3(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;
            }
        }
    }
    
    int main()
    {
        int A[]={1,2,3,4,5,6,7,8,9};
        int length=sizeof(A)/sizeof(A[0]);
        ReOrderOddEven_2(A,length);
        for(int i=0;i<length;i++)
            cout<<A[i]<<" ";
        cout<<endl;
    
        int B[]={1,2,3,4,5,6,7,8,9};
        vector<int> C(B,B+length);
        ReOrderOddEven_1(C);
        for(int i=0;i<length;i++)
            cout<<C[i]<<" ";
        cout<<endl;
    
        ReOrderOddEven_3(B,length,isEven);
        for(int i=0;i<length;i++)
            cout<<B[i]<<" ";
        cout<<endl;
        return 0;
    }
    

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/beb5aa231adc45b2a5dcc5b62c93f593?rp=1

    AC代码:

    class Solution {
    public:
    	void reOrderArray(vector<int> &array) {
    	  if(array.size()<=0)
                return;
            vector<int> odds,evens;
            unsigned int i;
            for(i=0;i<array.size();i++){
                if((array[i]&0x1)!=0)
                   odds.push_back(array[i]);
                if((array[i]&0x1)==0)
                   evens.push_back(array[i]);
            }
            
            for(i=0;i<odds.size();i++)
                array[i]=odds[i];
            int k=i;
            for(i=0;i<evens.size();i++)
                array[k++]=evens[i];
    	}
    };
    

      

  • 相关阅读:
    1300多万条数据30G论坛大数据优化实战经验小结(转)
    spring 攻略第二版文摘
    关于extjs中动态添加TabPanel的tab项并以iframe显示的整理(转)
    effective_java_2nd_endition文摘
    软件开发中常见的十大系统瓶颈(转)
    浅谈JAVA集合框架(转)
    java EE设计模式spring企业级开发最佳实践文摘
    layout 布局(转)
    COM高手总结的八个经验和教训
    IShellLink应用(创建快捷方式)
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4643404.html
Copyright © 2011-2022 走看看