给定一个非负整数数组 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
思路:
奇数放在一个列表,偶数放在一个列表,再交叉遍历构成一个新的列表
Python代码实现如下:
class Solution(object):
def sortArrayByParityII(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
res=[]
n1=[]
n2=[]
for i in A:
if i%2==0:
n1.append(i)
elif i%2==1:
n2.append(i)
for i in range(len(n1)):
res.append(n1[i])
res.append(n2[i])
return res
升级版 别人的脑子怎么都这么好使。。。来源于题目评论区
python代码实现如下:
from itertools import chain
class Solution:
def sortArrayByParityII(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
odd = []
even = []
for i in A:
if i & 1: # 和1做与运算来判断奇偶数
even.append(i)
else:
odd.append(i)
return list(chain(*zip(odd, even)))
*zip函数:
zip() 函数用于将可迭代对象作为参数,将对象中 对应的元素 打包成一个个元组,然后返回由这些元组组成的对象。
如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同。
利用 * 号操作符,与zip相反,进行解压。
举例转自(https://www.runoob.com/python/python-func-zip.html)
列表元素依次相连:
# -*- coding: UTF-8 -*-
l = ['a', 'b', 'c', 'd', 'e','f']
print l
#打印列表
print zip(l[:-1],l[1:])
输出结果:
['a', 'b', 'c', 'd', 'e', 'f']
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'), ('e', 'f')]
chain函数: 就是链的意思
chain函数来自于itertools库,itertools库提供了非常有用的基于迭代对象的函数,而chain函数则是可以串联多个迭代对象来形成一个更大的迭代对象 使用条件:你想在多个对象执行相同的操作,但是这些对象在不同的容器中,使代码在不失可读性的情况下避免写重复的循环
我理解就是连一起再固定类型
举例如下:
letters = ['a', 'b', 'c', 'd', 'e', 'f']
booleans = [1, 0, 1, 0, 0, 1]
print(list(itertools.chain(letters,booleans)))
# ['a', 'b', 'c', 'd', 'e', 'f', 1, 0, 1, 0, 0, 1]
print(tuple(itertools.chain(letters,letters[3:])))
# ('a', 'b', 'c', 'd', 'e', 'f', 'd', 'e', 'f')
print(set(itertools.chain(letters,letters[3:])))
# {'a', 'd', 'b', 'e', 'c', 'f'}
print(list(itertools.chain(letters,letters[3:])))
# ['a', 'b', 'c', 'd', 'e', 'f', 'd', 'e', 'f']
for item in list(itertools.chain(letters,booleans)):
print(item)