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++;
             }
      
          }
      };

       

 

posted @ 2020-02-13 19:04  靖愁  阅读(179)  评论(0编辑  收藏  举报