在python中对列表重新排序,使偶数首先出现

2024-06-06 21:11:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python进行编程面试,我对这个问题感到困惑。这个问题需要一个数字数组,并且应该输出一个列表,其中偶数是先排序的。您应该在不分配额外存储空间的情况下执行此操作

他们给出了一个解决方案,我对它进行了测试,但没有给出正确的答案

def even_odd(arr):
    next_even = 0
    next_odd = len(arr) - 1

    while next_even < next_odd:
        if arr[next_even] % 2 == 0:
            next_even += 1
            print("next" + str(next_even))
        else:
            arr[next_even] = arr[next_odd]
            arr[next_odd] = arr[next_even]
            next_odd -= 1
            print(arr)
            print("first" + str(arr[next_even]))
    return arr


print(even_odd([1, 2, 3, 4, 5, 6]))

结果是[6,2,4,4,5,6] 我也不理解元素之间相互交换的机制(A[下一个偶数],[下一个奇数]=A[下一个奇数],[下一个偶数])。我认为这是一个重要的概念,当你不能创建另一个数组时,你必须交换元素,但我似乎不能把我的头围绕它

有人能帮我解释一下我的代码哪里出错了吗?谢谢


Tags: 元素列表排序编程数字数组nexteven
3条回答

想想这些话:

arr[next_even] = arr[next_odd]
arr[next_odd] = arr[next_even]

无论next_evennext_odd的值是什么,结果都是这些索引的值相等。那显然被窃听了。如果将其改为交换,则该算法将起作用:

arr[next_even], arr[next_odd] = arr[next_odd], arr[next_even] 

最后,在Python中,只使用排序而不分配额外的存储应该是更容易的方法。简单地说:

>>> L = [1, 2, 3, 4, 5, 6]
>>> L.sort(key=(2).__rmod__)
>>> L
[2, 4, 6, 1, 3, 5]

交换可以通过这样做(或类似操作)来完成

arr[i], arr[i+1] = arr[i+1], arr[i]

这是干什么的

假设我们有一个数组=[1,2,3,4]

如果我们执行类似array[0], array[1] = array[1], array[0]的操作,我们就是在“交换”这些数组值

因此,生成的数组将是[2,1,3,4]。这是因为array[0]array[1]处被赋值,而array[1]array[0]处被赋值

我们为什么需要它

这有效地节省了执行交换所需的临时变量。如果我们尝试进行交换而不使用上述语法,则会得到如下结果:

array = [1,2,3,4]
array[0] = array[1] # [2,2,3,4] We have lost the value 1

因此,我们需要一个临时值来保存我们正在“交换”的值

array = [1,2,3,4]

temp = array[0] #1
array[0] = array[1] # [2,2,3,4] We have lost the value 1
array[1] = temp #[2,1,3,4]

您的代码已更新

def even_odd(arr):
    next_even = 0
    next_odd = len(arr) - 1

    while next_even < next_odd:
        if arr[next_even] % 2 == 0:
            next_even += 1
        else:
            arr[next_even], arr[next_odd] = arr[next_odd], arr[next_even]
            next_odd -= 1
    return arr


print(even_odd([1, 2, 3, 4, 5, 6])) # Output: [6, 2, 4, 5, 3, 1]

您在交换时没有检查下一个奇数索引处的元素是偶数还是奇数。如果下一个奇数处的元素是奇数,只需将索引向左移动即可

def even_odd(arr):
    next_even = 0
    next_odd = len(arr) - 1

    while next_even < next_odd:
        if arr[next_even] % 2 == 0:
            next_even += 1
        else:
            if arr[next_odd] % 2 == 0:
                arr[next_odd], arr[next_even] = arr[next_even], arr[next_odd]
                next_even += 1
                next_odd -= 1
            else:
                next_odd -= 1
    return arr


print(even_odd([1, 5, 2, 0, 3, 4, 5, 7, 8, 1, 10]))

[10, 8, 2, 0, 4, 3, 5, 7, 5, 1, 1]

相关问题 更多 >