python活力练习Day27

题目描述:

给定一个非负整数数组 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] 也会被接受。

提示:

  1. 2 <= A.length <= 20000
  2. A.length % 2 == 0
  3. 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

原文地址:https://www.cnblogs.com/xiaodangdang/p/13214797.html