题目
解法1
暴力解法
正常的思路就是新建两个列表,然后遍历原列表,将奇数和偶数分别放入新的列表中,再将新列表合并即可。该方法遍历一次,时间复杂度为O(n),空间复杂度也为O(n).
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
list_odd = []
list_even = []
for inum in nums:
if inum % 2 == 1:
list_odd.append(inum)
else:
list_even.append(inum)
return list_odd + list_even #奇数在前
双指针法
如果再原数组直接调整奇数偶数的顺序,那么空间复杂度可以优化到O(1),是用双指针法,一个指针指向列表开头,一个指向末尾。
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
i = 0
j = len(nums)-1
while i<=j: #循环结束的条件是前指针比后指针大
if nums[i] % 2 == 0: #如果前指针对应的数是偶数,则和后指针的数交换
nums[i],nums[j] = nums[j],nums[i]
j -= 1
else: #如果前指针对应的数是奇数,则往后移动。后指针不用动
i+=1
return nums