zoukankan      html  css  js  c++  java
  • leetcode1356之根据数字二进制下1的数目排序

    题目描述:

    给一个数组arr,根据arr中数字的二进制中1的个数进行升序排列,如果1的数目相同,则根据数字大小进行升序排序,返回排序后的数组

    示例:

    输入:arr = [0,1,2,3,4,5,6,7,8]
    输出:[0,1,2,4,8,3,5,6,7]
    解释:[0] 是唯一一个有 0 个 1 的数。
    [1,2,4,8] 都有 1 个 1 。
    [3,5,6] 有 2 个 1 。
    [7] 有 3 个 1 。
    按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits
     
    代码如下:
     1 def sortbin(arr):
     2     bin_num = []  # 存储bin_arr二进制数中1的个数
     3     for i in arr:
     4         count = 0
     5         while i:
     6             i &= i - 1
     7             count = count + 1
     8         bin_num.append(count)
     9 
    10     temp = [[] for i in range(510)]
    11     # 将arr中具有相同二进制位数的数放在一起
    12     for i in range(len(bin_num)):
    13         temp[bin_num[i]].append(arr[i])
    14 
    15     reslut = []
    16     for i in temp:
    17         # 对具有相同二进制位数进行大小排序
    18         i.sort()
    19         if i:
    20             reslut.extend(i)
    21         else:
    22             continue
    23 
    24     return reslut
    25 
    26 
    27 print("---------------测试sortbin()-------------")
    28 arr = [1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1]
    29 reslut = sortbin(arr)
    30 print("result=", reslut)
    31 
    32 
    33 def sortbin1(arr):
    34     def count_bin(x):
    35         return bin(x).count('1')
    36 
    37     reslut = sorted(arr, key=lambda x: (count_bin(x), x))
    38 
    39     return reslut
    40 
    41 
    42 print('++++++++++++测试sortbin1()++++++++++++++')
    43 reslut = sortbin1(arr)
    44 print('result=', reslut)  

    输出如下:

    ---------------测试sortbin()-------------
    result= [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
    ++++++++++++测试sortbin1()++++++++++++++
    result= [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

    总结:

    比较两种方法,很明显方法2要简洁的多,代码质量更高。在方法1中,整体思路是求出arr数组中各数字1的个数,并将具有相同数目的元素放在一起,组成新的数组,遍历该数组,对该数组中各元素按数字大小排序,然后将各元素加入到结果数组中即可。因此方法1需要考虑两个问题。第一:如何求出arr数组中各数字的二进制?第二:对求出的二进制,如何统计1的个数并将具有相同数目1的元素放在一起?上面代码一一给出了解答。

    方法2中,代码清晰简洁。定义了一个嵌套函数用来统计数字二进制中1的数目,然后在排序过程中采用lambda表达式,排序的两个主次限制条件分别为二进制位数和数字大小

    加强理解的地方:方法1中二进制位数求取方法:num&=num-1。num和num-1相与至0的次数即为num二进制位数。sort()方法和sorted()方法区别,sort()方法排序后没有返回新的对象,它是对当前调用对象进行了排序,返回的还是当前对象;sorted()方法返回了新对象,原调用对象没发生变化。

  • 相关阅读:
    juc原子类之五:AtomicLongFieldUpdater原子类
    DICOM:C-GET与C-MOVE对照剖析
    android createbitmap函数内存溢出,求解怎样进行处理out of memory溢出问题
    TRIZ系列-创新原理-32-改变颜色原理
    FP-Growth算法之频繁项集的挖掘(python)
    个人年终总结
    J2EE之ANT
    log4net 使用与配置 每天一份log文件
    Android 完美实现图片圆角和圆形(对实现进行分析)
    Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。
  • 原文地址:https://www.cnblogs.com/rounie/p/13047838.html
Copyright © 2011-2022 走看看