zoukankan      html  css  js  c++  java
  • 剑指offer-调整数组内奇偶数顺序

    题目描述

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

    解题思路

    时间换空间的:

    思想可以参考插入排序。时间复杂度为o(n^2),空间复杂度为o(1)

    class Solution {
    public:
        void reOrderArray(vector<int> &array) {
            int i,j;
            int tmp;
            for(i=0;i<array.size();i++){
                tmp=array[i];
                j=i-1;
                if(array[i]%2==1){
                while(j>=0&&array[j]%2==0){
                    array[j+1]=array[j];
                    j--;
                  }
                    array[j+1]=tmp;
                }
            }
        }
    };
    

      类似的,也可以用快排思想解决这个问题。

    空间换时间的:

    链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593
    来源:牛客网
    
    //第二个思路:再创建一个数组
    class Solution{
    public:
        void reOrderArray(vector<int> &array) {
     
            vector<int> array_temp;
            vector<int>::iterator ib1, ie1;
            ib1 = array.begin();
     
     
            for (; ib1 != array.end();){            //遇见偶数,就保存到新数组,同时从原数组中删除
                if (*ib1 % 2 == 0) {
                    array_temp.push_back(*ib1);
                    ib1 = array.erase(ib1);
                }
                else{
                    ib1++;
                }
     
            }
            vector<int>::iterator ib2, ie2;
            ib2 = array_temp.begin();
            ie2 = array_temp.end();
     
            for (; ib2 != ie2; ib2++)             //将新数组的数添加到老数组
            {
                array.push_back(*ib2);
            }
        }
    };
    

      第二个思路的优化:

    不用删除偶数,在数组中删除偶数带来额外的开销,记录偶数的位置,然后下一个基数直接覆盖过去就行!

     

  • 相关阅读:
    罗马数字
    逆序对
    等价串
    郊区春游
    贝壳找房函数最值
    Educational Codeforces Round 45 Editorial
    Codeforces Round #486 (Div. 3)
    checkbox保存和赋值
    oninput和onchange的区别
    cookie路径概念理解
  • 原文地址:https://www.cnblogs.com/curo0119/p/9045253.html
Copyright © 2011-2022 走看看