leetcode144 正负数交错排列(不占用额外存储空间) python
def arr_rank(arr):
arr=sorted(arr)#升序排序
#若均为正数或均为负数,直接输出
if arr[0]>=0 or arr[-1]<0:
return arr
#start,end=0,len(arr)-1
#计算负数的个数
for i in range(len(arr)):
if arr[i]>=0:
a= i
break
#print(a)
if a<len(arr)-a:#若负数少,取相同个数的正负数从第一个数开始交错排列
start,end = 0,2*a-1
elif a>len(arr)-a:#若正数少,从第2个数开始交错排列
start,end = 1,len(arr)-1
else:
start,end = 0,len(arr)-1
while start<end:
arr[start],arr[end]=arr[end],arr[start]#语法糖
start +=2
end -= 2
# temp=arr[start]
# arr[start]=arr[end]
# arr[end]=temp
return arr
arr=[1,1,2,-1,-3,1,3]
arr_rank(arr)
其他解法
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
# print(A)
# print(start)
# print(end)
# print('--')
if(A[start]<0):
start+=1
#print(start)
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
# print(start)
# print(end)
# print('---')
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
# print(A)
# print('----')
return A
s=Solution()
print(s.rerange([-1,2,-3,4,5]))