剑指Offer:调整数组顺序使奇数位于偶数前面(Python语言实现)

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

快速排序的思想。为了减少交换次数,直接使用两个索引lowhigh分别向右、向左进行检索直到找到满足要求的值为止,进行交换。这里使用了一个扩展函数,用来表示通用方法func

class Solution:
    def reorder_array(self, array):
        if not array or len(array) == 1:
            return array
        return self.reorder_common(array, self.is_even)

    def reorder_common(self, array, func):  # 通用方法func
        low, high = 0, len(array)-1
        while low < high:       # 结束条件,不包含等于情况
            while low < high and not func(array[high]):     # 向左检索
                high -= 1
            while low < high and func(array[low]):  # 向右检索
                low += 1
            array[low], array[high] = array[high], array[low]   # 交换
            # print(low, high)
        return array

    def is_even(self, value):
        if value & 0x1 == 1:
            return True
        else:
            return False


st = Solution()
seq = [2, 4, 6, 8, 1, 3, 5, 7]
print(st.reorder_array(seq))

使用设置支点的快速排序方法来操作。

class Solution:
    def reorder_array(self, array):
        if not array or len(array) == 1:
            return array
        return self.reorder_common(array, self.is_even)

    def reorder_common(self, array, func):  # 通用方法func
        low, high = 0, len(array)-1
        pivot = array[low]
        while low < high:       # 结束条件,不包含等于情况
            while low < high and not func(array[high]):     # 向左检索
                high -= 1
            array[low] = array[high]    # 赋值给低地址
            while low < high and func(array[low]):  # 向右检索
                low += 1
            array[high] = array[low]    # 赋值给高地址
        array[low] = pivot
        return array

    def is_even(self, value):
        if value & 0x1 == 1:
            return True
        else:
            return False


st = Solution()
seq = [2, 4, 6, 8, 1, 3, 5, 7]
print(st.reorder_array(seq))

直接分别提取符合要求的值后进行合并。

class Solution:
    def reorder_array(self, array):
        if not array or len(array) == 1:
            return array
        return self.reorder_common(array, self.is_even)

    def reorder_common(self, array, func):  # 通用方法func
        left = [au for au in array if func(au)]     # 符合要求的左半区
        right = [au for au in array if not func(au)]    # 符合要求的右半区
        return left + right

    def is_even(self, value):
        if value & 0x1 == 1:
            return True
        else:
            return False


st = Solution()
seq = [2, 4, 6, 8, 1, 3, 5, 7]
print(st.reorder_array(seq))

(最近更新:2019年09月21日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值