描述
给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组。
不需要保持正整数或者负整数原来的顺序。
您在真实的面试中是否遇到过这个题?
是
样例
给出数组[-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]))