• 面试题:二维数组排序


    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转为元组并打印
    作者:做梦的人(小姐姐)
    出处:https://www.cnblogs.com/chongyou/
    本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
    微信号:18582559217
  • 相关阅读:
    目标检测算法原理
    物体检测项目
    Bootstrap+Font Awesome图标不显示 或显示错误解决办法
    关于 微信发送被动回复音乐消息 用户接收不到的问题
    多线程操作SQLite注意事项
    SQLiteDatabase中query、insert、update、delete方法参数说明
    Android开发:使用Fragment改造TabActivity
    UDP广播与多播
    Android 布局文件 属性区别
    Android开发
  • 原文地址:https://www.cnblogs.com/chongyou/p/15185991.html
Copyright © 2020-2023  润新知