题目描述:
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
你可以返回任何满足上述条件的数组作为答案。
示例:
输入:[4,2,5,7] 输出:[4,5,2,7] 解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
提示:
2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000
解题思路:
第一种:1.首先将A分为两部分:even列表存储偶数;odd列表存储奇数;
2.其次设置两个变量遍历(i ,j = 0,1 以步长2进行叠加)列表A,将对应位置值用偶数与奇数列表值进行替代;
3.最终输出A
第二种:采用双指针的思想
优点:未额外创建空间
1.首先创建两个指针(i, j = 0,1)表示偶数和奇数位置索引
2.其次遍历列表A,如果对应奇偶位置的值都不一致,那么交换两个位置的值,同时向前 +2;如果偶数对应位置的值一致而奇数位置值不一致,那么将偶数索引(i)向前 + 2;否则 将奇数索引(j)向前 +2。
3.最终输出A
python代码:
1 #方法一:将奇偶数分开 2 def sortArrayByParityII(A): 3 # 找出列表的所有偶数 4 even = [i for i in A if i % 2 == 0] 5 # 找出所有的奇数 6 odd = [i for i in A if i % 2 == 1] 7 8 i, j = 0, 1 # 偶数奇数 9 n = len(A) 10 while i < n and j <= n: 11 index = i // 2 12 A[i] = even[index] 13 A[j] = odd[index] 14 i += 2 15 j += 2 16 17 return A 18 19 #方法二:双指针 20 def sort(A): 21 22 i, j = 0, 1 23 while i < len(A) and j <= len(A): 24 if A[i] % 2 != 0 and A[j] % 2 == 0: 25 A[i], A[j] = A[j], A[i] 26 i += 2 27 j += 2 28 elif A[j] % 2 != 0: 29 j += 2 30 else: 31 i += 2 32 33 return A 34 35 if __name__ == "__main__": 36 A = [4,2,2,5,7,3] 37 print("方法一输出结果:{}".format(sortArrayByParityII(A))) 38 print("方法二输出结果:{}".format(sort(A)))
输出结果:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii