zoukankan      html  css  js  c++  java
  • 32. 调整数组顺序使奇数位于偶数前面

     解题思路:用快排的思想

     (双指针扫描) O(n)O(n)
    用两个指针分别从首尾开始,往中间扫描。扫描时保证第一个指针前面的数都是奇数,第二个指针后面的数都是偶数。

    每次迭代时需要进行的操作:

    第一个指针一直往后走,直到遇到第一个偶数为止;
    第二个指针一直往前走,直到遇到第一个奇数为止;
    交换两个指针指向的位置上的数,再进入下一层迭代,直到两个指针相遇为止;

    /*
     * 2个指针,一个从前往后,遍历元素是不是奇数。不满足条件跳出while循环,输出当前
     *                        元素的下标i
     * 一个从后往前查元素是不是偶数。不满足条件跳出while循环,输出当前元素的下标j
     * 当两个while都不执行的时候,进行数组元素的交换。
     *
     * /

    class Solution {
    public:
        void reOrderArray(vector<int> &array) {
             int l = 0, r = array.size() - 1;
             while (l < r) {
                 while (l < r && array[l] % 2 == 1) l ++ ;
                 while (l < r && array[r] % 2 == 0) r -- ;
                 if (l < r) swap(array[l], array[r]);
             }
        }
    };
    
    作者:yxc
    链接:https://www.acwing.com/solution/acwing/content/738/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

      

     

    牛客网

     题解:

    链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
    来源:牛客网

    思路:参考快速排序

      • i++往前走碰到偶数停下来,j = i+1
      • a[j]为偶数,j++前进,直到碰到奇数
        • a[j]对应的奇数插到a[i]位置,j经过的j-i个偶数依次后移
      • 如果j==len-1时还没碰到奇数,证明ij之间都为偶数了,完成整个移动
      •  参考代码:

      • 链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
        来源:牛客网
        
        class Solution {
        public:
            void reOrderArray(vector<int> &array) {
                int len = array.size();
                if(len <= 1){ // 数组空或长度为1
                    return;
                }
         
                int i = 0;
                while(i < len){
                    int j = i + 1;
                    if(array[i]%2 == 0){ // a[i]为偶数,j前进,直到替换
                        while(array[j]%2 == 0){ // j为偶数,前进
                            if(j==len-1)// i为偶数,j也为偶数,一直后移到了末尾,证明后面都是偶数
                                 return;
                            j++;
                        }
                        // 此时j为奇数
                        int count = j-i;
                        int temp = array[i];
                        array[i] = array[j];
                        while(count>1){
                            array[i+count] = array[i+count-1];//数组后移
                            count--;
                        }
                        array[i+1] = temp;
                    }
                    i++;
                }
            }
        };

        自己:

      • class Solution {
        public:
            void reOrderArray(vector<int> &array) {
               int i = 0 ,j = 0,n = array.size()-1,count = 0, temp;
               if(n+1 <= 1) return;
               while(i <= n)
               {
                   j = i + 1;
                   if(array[i]%2 == 0)
                   {
                       while(j <= n && array[j]%2 == 0) j++;
                       if(j > n) return;
                       else
                       {
                           temp = array[i];
                           swap(array[i], array[j]);
                       }
                       
                       //数组后移
                       for(int k = j-1; k >= i+1 ;k--)
                       {
                           array[k+1] = array[k];
                       }
                       array[i+1] = temp;
                       
                   }
                   else i++;
               }
        
            }
        };
    带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
  • 相关阅读:
    Linux_23 DNS 正向解析区域、反向解析区域;主/从;子域;基本安全控制
    Linux_22 加密和解密及OpenSSL
    Linux_21 日志系统、ssh服务、系统安装及系统故障排除
    Linux_20 子网划分
    Akavache简明使用指南
    Oracle存储过程解析XML内容
    docker部署微服务不支持中文字体的解决方案
    Three.js
    Three.js
    [Linux] vim状态栏配置
  • 原文地址:https://www.cnblogs.com/make-big-money/p/12304721.html
Copyright © 2011-2022 走看看