zoukankan      html  css  js  c++  java
  • 剑指offer:调整数组顺序使奇数位于偶数前面

    题目描述:

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

    解题思路:

    思路一:借助辅助空间,遍历一遍数组,将奇数和偶数分别存入两个队列,再分别情况奇数队列和偶数队列,就对应的数转移到原数组上。

    思路二:实际面试中,一般是需要考察这道题利用插入排序的思想。既然要将奇数放在前面偶数放在后面,那么就扫描数组,找到第一个偶数位置为i,再找该偶数后面的第一个奇数为j,将i到j-1的所有数往后移动一位,再将这个j上的奇数放到i上。接下来,从当前这个奇数向后扫描,同样找到第一个偶数,以及偶数后的第一个奇数,按照之前的方式移动偶数,并填补奇数位置。这样就不需要用到额外的数组空间来存数。注意每次移动完偶数后,需要将原始指向第一个偶数的指针后移,因为此时这个i的位置指向的是奇数。

    代码:

    思路一:

    class Solution {
    public:
        void reOrderArray(vector<int> &array) {
            queue<int> odd;
            queue<int> even;
            for(int i=0; i<array.size(); i++)
            {
                if(array[i]%2==0)
                    even.push(array[i]);
                else
                    odd.push(array[i]);
            }
            int i;
            int odd_size = odd.size();
            for(i=0; i<odd_size; i++)
            {
                array[i] = odd.front();
                odd.pop();
            }
            int even_size = even.size();
            for(i; i<(odd_size+even_size); i++)
            {
                array[i] = even.front();
                even.pop();
            }
        }
    };

    思路二:

    class Solution {
    public:
        void reOrderArray(vector<int> &array) {
            if(array.empty() || array.size()==1)
                return;
            int temp;
            for(int i=0;i<array.size();i++)
            {
                if(array[i]%2==0)//找到第一个偶数的位置
                {
                     for(int j=i+1;j<array.size();j++)
                     {
                         if(array[j]%2==1)//从第一个偶数往后找到第一个奇数的位置
                         {
                             temp=array[j];//先保存下奇数位置
                             while(j>i)//把偶数后移一个位置
                             {
                                 array[j]=array[j-1];
                                 j--;
                             }
                             array[j]=temp;//空出来的位置填上奇数
                             i++; //表示所有偶数都已经后移了一位,对应指向第一个偶数的指针也后移
                         }
                     }
                }
            }
        }
    };
  • 相关阅读:
    [转载]C#.NET中Dns类的常用方法及说明
    [转载]如何辨别真假百度蜘蛛
    Lottie的json动画
    iOT
    iOS字体大小
    针对Xcode 9 + iOS11 的修改,及iPhone X的适配
    shell脚本之 给PNG图片添加后缀@3x
    正则表达式
    CSS
    XcodeProj,使用Ruby更改工程文件
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10587847.html
Copyright © 2011-2022 走看看