다른 알고리즘 -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

상대 위치를 고려

제목 설명

배열 번호의 순서를 조절하는 기능을 실현하기 위해, 정수의 배열을 입력 어레이의 전반의 모든 홀수 부분은 홀수 어레이 전체의 후반에있는 홀수 간의 상대적 짝수, 홀수되도록 심지어 지도록 동일한 위치.

분석

  • 방법 1 : 사용 python列表이 결국 해답, 시간 복잡도에 병합 초기화 목록 O(n), 공간의 복잡성을 O(n).
  • 방법 2 : 주제에 대한 아이디어의 교환을 사용하지만,하는 일이 될 수 없습니다 快排划分교환의 종류를 사용하는 아이디어는, 수와 상대 번호에 대한 교환의 중간에 두 번째가 교환되도록, 그렇지 않으면 동일한 상대 위치를 보장 할 수 없으며 位置不变, 사용 冒泡생각합니다.

코드

  • 방법 1 :
# -*- 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
  • 방법 2 :
# -*- 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
게시 된 219 개 원래 기사 · 원 찬양 85 ·은 14 만 + 조회수

추천

출처blog.csdn.net/z_feng12489/article/details/103471884