其他算法-013-調整數組順序使奇數位於偶數前面

不考慮相對位置

題目描述

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。

分析

使用雙指針,利用快排一次劃分思想,很快得到答案。

代碼

# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        # write code here
        
        if not array:
            return []
        
        length = len(array)
        left = 0
        right = length-1
        
        while left<right:
            while left<right and not self.isEven(array[left]):
                left += 1
            
            while left<right and self.isEven(array[right]):
                right -= 1
                
            if left<right:
                array[left], array[right] = array[right], array[left]
            
        return array
                
    def isEven(self, num):
        return num & 1 == 0

考慮相對位置

題目描述

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

分析

  • 方法一:利用python列表,初始化兩列表最終在合併成所需答案,時間複雜度爲O(n),空間複雜度爲O(n)
  • 方法二:利用上題的交換思想,但是不能是一次快排劃分,否則不能保證是相對位置不變,所以利用交換排序的思想,交換的兩數中間的數要與被交換的數相對位置不變,採用冒泡的思想。

代碼

  • 方法一:
# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        # write code here
         
        if not array:
            return []
         
        even = []
        odd = []
         
        for i in array:
            if i & 1 == 1:
                odd.append(i)
            else:
                even.append(i)
                 
        odd.extend(even)
        return odd
  • 方法二:
# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        # write code here
        
        if not array:
            return []
        
        length = len(array)
        left = 0
        while left < length:
            # 尋找左邊第一個偶數
            while left < length and not self.isEven(array[left]):
                left += 1
            
            right = left+1
            # 尋找此偶數後面的第一個奇數奇數
            while right < length and self.isEven(array[right]):
                right += 1
                
            #按順序排列交換
            if left<length and right<length:
                temp = array[right]
                for i in range(right,left,-1):
                    array[i] = array[i-1]
                array[left] = temp
            
            if left<length and self.isEven(array[left]):
                break
                
        return array
                
    def isEven(self, num):
        return num & 1 == 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章