【Codewars每日一题】- Sort the odd

题目

题目地址

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def sort_array(source_array):
odd_list = []

for i in range(len(source_array)):
if source_array[i] % 2 != 0:
odd_list.append(source_array[i])
source_array[i] = True

list.sort(odd_list)

index = 0
for i in range(len(source_array)):
if source_array[i] == True:
source_array[i] = odd_list[index]
index += 1
return source_array

最佳答案

  • 最佳实践解法
    1
    2
    3
    def 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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> squares = [x**2 for x in range(10)]
>>> squares

# 获取可以被3整除的
>>> numbers = [x for x in range(20) if x % 3 == 0]
>>> numbers
[0, 3, 6, 9, 12, 15, 18]

# 可以加多个元素判断
>>> print([ (x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8 ])
[(5, 9), (7, 9), (9, 9)]

>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

# 生成dict
>>> print(dict([(x,x*10) for x in range(5)]))
{0: 0, 1: 10, 2: 20, 3: 30, 4: 40}

list.pop()方法

pop()函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

  • 语法
    1
    list.pop(obj=list[-1])

obj – 可选参数,要移除列表元素的对象index。

  • 返回值
    返回从列表中移除的元素对象。

  • 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> list
    [5, 2, 3, 2, 8, 1, 4, 3, 32]
    >>> list.pop()
    32
    >>> list
    [5, 2, 3, 2, 8, 1, 4, 3]
    >>> list.pop(5)
    1
    >>> list
    [5, 2, 3, 2, 8, 4, 3]
    >>> list.pop(8)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    IndexError: pop index out of range
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/Codewars-Sort-the-odd.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%