题目
You have an array of numbers.
Your task is to sort ascending odd numbers but even numbers must be on their places.
Zero isn’t an odd number and you don’t need to move it. If you have an empty array, you need to return it.
Examples
1 | sortArray([5, 3, 2, 8, 1, 4]) == [1, 3, 2, 8, 5, 4] |
思路
题目的含义是对一个list
中的奇数进行排序,而偶数保持顺序不变。
首先想到的思路是将list
转换成map
,其中key就是list
的index,然后筛选出所有value是奇数的,对其排序处理。
或者遍历list,将所有奇数赋值给另外一个列表odd_list
,并将原来的位置的数值设置为一个标记。然后对odd_list
排序,在放入到原list。
答案
我的答案
1 | def sort_array(source_array): |
最佳答案
- 最佳实践解法
1
2
3def sort_array(arr):
odds = sorted((x for x in arr if x%2 != 0), reverse=True)
return [x if x%2==0 else odds.pop() for x in arr]
最佳答案的思路跟我的思路是一样的,只是实现方式更加简洁。同样时先筛选出奇数列表,对其排序,然后再遍历原列表,将排过序的数据放置回。
知识点
列表推导式
列表推导式(list comprehension)是利用其他列表创建新列表(类似于数学术语中的集合推导式)的一种方法。它的工作方式类似于for循环,也很简单。
1 | 2 for x in range(10)] squares = [x** |
list.pop()方法
pop()
函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
- 语法
1
list.pop(obj=list[-1])
obj – 可选参数,要移除列表元素的对象index。
返回值
返回从列表中移除的元素对象。实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14list
[5, 2, 3, 2, 8, 1, 4, 3, 32]
list.pop()
32
list
[5, 2, 3, 2, 8, 1, 4, 3]
5) list.pop(
1
list
[5, 2, 3, 2, 8, 4, 3]
8) list.pop(
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range