I am a teacher!

导航

习题解析之:奇偶插入

【问题描述】

给定一个无序的列表A,其中数据均为非负整数,其中奇数和偶数各占一半。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

当列表A中的奇数和偶数个数相同时,将A中的奇数和偶数分别排序,并在放入列表时保持:当i是奇数时,A[i]为奇数,i为偶数时,A[i]为偶数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

如果输入的数据不符合本题要求,输出ERROR

本题不考虑内存限制,可使用多个列表完成操作。

示例 1‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输入:
4 5 7 2

输出:
[2, 5, 4, 7]

示例 2‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
输入:
1 2 3

输出:
ERROR

【编程思路1】

        将输入的无序的列表A中的奇数添加到初始为空的奇数列表 odd_list 中,偶数添加到初始为空的偶数列表 even_list 中。 

        若odd_list 和 even_list 两个列表的长度相等,则输入数据符合要求,将奇数列表 odd_list 和偶数列表 even_list 分别排序后,再按排序后的顺序,先在偶数列表 even_list取一个元素,再在奇数列表 odd_list取一个元素的方式,将它们添加到初始为空的结果列表 result_list 中,直至两个列表中的元素取完。

        编写的源程序如下:

        image

 【编程思路2】

         编程思路1 给出的源程序中,是通过循环遍历 lsa 中的每个元素从而得到 odd_list 和 even_list 两个列表。也可以将输入的列表 lsa 先排序,再利用列表推导式生成odd_list 和 even_list 两个列表。

        编写的源程序如下:

        image

 【编程思路3】

        上面的两个源程序中均生成了 odd_list 和 even_list 两个列表,实际上可以不用生成这两个列表。

        按偶数在前,奇数在后的顺序对输入的列表 lsa 进行排序,即设置第 1 关键字为 x %2,这样偶数 x % 2 的值为 0,奇数 x % 2 的值为1,计算值为 0 的偶数排在计算值为1的奇数的前面;再设置第 2 关键字为 x,即都是偶数的话,按其数值大小升序排列,都是奇数的话,也按其数值大小升序排列。用 lambda 表达式设置为: key = lambda x:(x % 2, x)。

        将列表 lsa 排序后,若输入数据符合要求,则 lsa 列表的前一半元素 lsa[0:len(lsa) //2] 一定是偶数,后一半元素 lsa[len(lsa) //2: ] 一定是奇数。

        若元素 lsa[len(lsa) //2 - 1] 是奇数,或者 lsa[len(lsa) //2] 是偶数,则输入数据不符合要求。

        若输入数据符合要求,则用循环 for i in range(len(lsa) // 2):依次取前一半的一个偶数 lsa[i],后一半的一个奇数 lsa[i + len(lsa) // 2] 添加到合并后的列表中。

        编写的源程序如下:

        image

posted on 2025-11-28 16:58  aTeacher  阅读(0)  评论(0)    收藏  举报