python--lintcode144. 交错正负数

描述

给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。

不需要保持正整数或者负整数原来的顺序。

您在真实的面试中是否遇到过这个题?  

样例

给出数组[-1, -2, -3, 4, 5, 6],重新排序之后,变成[-1, 5, -2, 4, -3, 6]或者其他任何满足要求的答案

挑战

原地完成,没有额外的空间

这一题的算法跟之前那题是很像的,都是双指针问题,具体见:https://blog.csdn.net/wenqiwenqi123/article/details/80795204

先把负数全移到左边,把正数全移到右边,然后再隔一个数交换一下左右两边。

特别需要注意的是,需要考虑三种情况:1、负数更多  2、正数更多  3、两者一样多

代码如下:

class Solution:
    """
       @param: A: An integer array.
       @return: nothing
    """
    def rerange(self, A):
        # write your code here
        if (A == None or len(A) == 0): return A
        start, end = 0, len(A) - 1
        while (start < end):
            while (start < end and A[end]>0):
                end -= 1
            while (start < end and A[start]<=0):
                start += 1
            if (A[start]>0 and A[end]<=0):
                temp = A[start]
                A[start] = A[end]
                A[end] = temp
                start += 1
                end -= 1

        if(A[start]<0):start+=1

        if(start<len(A)-start): #说明负数更少,两边应是正数
            start, end = 0, len(A) - 2
        elif(start>len(A)-start):start,end=1,len(A)-1  #正数更少,两边应是负数
        else:start,end=0,len(A)-1

        while(start<end):
            if(A[start]>0 or A[end]<0):break
            temp = A[start]
            A[start] = A[end]
            A[end] = temp
            start += 2
            end -= 2

        return A



s=Solution()
print(s.rerange([-1,2,-3,4]))

猜你喜欢

转载自blog.csdn.net/wenqiwenqi123/article/details/80805489