; ;

面试题:二维数组排序

1.以下题目转载自“光荣之路”,作者:三毛和荷西,原文链接:https://mp.weixin.qq.com/s/rOtUcZhZxDhP64NJdqvK9w

对以下数组进行排序:

arr = (

 [4,5,9,4,1],

 [11,14,9,6,20],

 [21,44,90,16,21],

 [16,34,99,600,230],

 [121,18,89,60,33]

)

期望结果:
数组arr[0][0]为最大值,arr[4][4]为第二大,arr[0][1]为第三大,arr[4][3]为第四大,依此类推arr[2][2]为最小值。

arr = (

 [600, 121, 90, 60, 34],

 [21,20, 16, 14, 9],

 [6,4, 1, 4, 5],

 [9,11, 16, 18, 21],

 [33,44, 89, 99, 230]

)

 

由题目可知:1. 排序后的二维列表的前半部分是从大到小排序,后半部分是从小到到排序2. 第一个元素比最后一个元素大,第二个元素比倒数第二个元素大。。。依次,直到中间的那个元素分别是两边元素中最小的。

算法:1. 使用列表推导式,将二维列表拆分为一维列表2. 将步骤1中得到的一维列表进行降序排列3. 声明两个变量,分别用于存储一维列表偶数位和奇数位的元素4. 基于位置遍历一位列表5. 判断当前位置是否是偶数位

a)如果是,则将当前位置元素依次加入的arr1的尾部,即元素还是保持一维列表从大到小的顺序

b)如果不是,则将当前位置元素依次加入arr2的头部,即元素按从小到大的顺序在arr1中排列

     因为每一次取的元素都会比上一次元素小,使用insert方法插入0位置,

     即每次将小的元素插入列表头部,以此实现从小到大的效果

6. 将arr1和arr2合并成一个新的列表,这个列表的前半部分从大到小排序,后半部分从小到小到大排序7. 声明一个变量result,存放结果列表;temp存放临时列表8. 基于坐标遍历遍历第6步生成的列表9. 判断当前坐标是否不为0,且能被5整除,如果是,则将temp加入到result中,并将temp重置为空列表

   a)当前坐标不为0,且不为5--->即说明temp中已经有5个元素

   b)将temp作为一个元素加入result,以此实现二维列表的效果

   c)将temp重置为空列表,用于重新取后面五位数

10. 不管步骤9的条件是否满足,都将当前位置元素加入temp中11. 重复步骤9和10,直到arr中所有的元素都被遍历完12. for循环遍历结束后,因为temp中还有值,此时i的值是len(arr)-1=19,不满足被5整除的条件

    即最后五个元素没有加入到result列表,通过else语句将temp加入到result

(for循环对应的else语句,只要for循环没有被break中断,循环结束后,else语句就会被执行)

arr = ( [4,5,9,4,1], [11,14,9,6,20], [21,44,90,16,21], [16,34,99,600,230], [121,18,89,60,33])

a_list = [j for i in arr for j in i]        # 将二维列表转化成一维列表
a_list.sort(reverse=True)                   # 按从大到小降序排列
arr1 = []                                   # 存储偶数位元素
arr2 = []                                   # 存储奇数位元素
for i in range(len(a_list)):                # 基于位置遍历一维列表
   if i % 2 == 0:                         # 判断是否是偶数位
       arr1.append(a_list[i])             # 如果是偶数位,就将偶数位元素顺序加入arr1
   else:          
       arr2.insert(0, a_list[i])          # 如果是奇数位,就将奇数位元素倒序加入arr2


arr = arr1+arr2                             # 将arr1和arr2合并成一个新列表
result = []
temp = []
for i in range(len(arr)):                   # 基于左边遍历列表
   if (i != 0 and i % 5 == 0):            # 当前左边是否为能被5整除,且不为0的值
       result.append(temp)                # 如果是,将temp列表加入result列表
       temp = []                          # 同时清空temp列表
   temp.append(arr[i])                    # 将当前坐标元素加入temp
else:
   result.append(temp)                    # 将最后一个temp(即最后五个元素)加入result

print(tuple(result))                        # 将result转为元组并打印

 

posted @ 2021-08-25 17:08  做梦的人-  阅读(138)  评论(0编辑  收藏  举报