如何按二进制表示中的数量对二进制数组进行排序

时间:2017-09-19 14:42:33

标签: ruby algorithm sorting

具有相同数量的" 1" s的数字应按十进制表示排序。

例如:

srt([3,7,8,9]) => [8,3,9,7]  # 1000, 11, 1001, 111

4 个答案:

答案 0 :(得分:3)

在Ruby中,您可以使用一种非常简单的方法:

def srt list
  list.sort_by { |number| number.to_s(2).count('1') }
end

它不是真正的性能效率,而是易于阅读。

答案 1 :(得分:3)

您可以将数组传递给sort_by

[1,2,3,4,5,6,7,8,9].sort_by { |i| [i.digits(2).count(1), i] }
#=> [1, 2, 4, 8, 3, 5, 6, 9, 7]

这将通过Array#<=>对项目进行排序,即通过数字本身对1位数和1位数相同的数字进行排序:

[
  1, 2, 4, 8,  # 1 1-bit  (0b0001, 0b0010, 0b0100, 0b1000)
  3, 5, 6, 9,  # 2 1-bits (0b0011, 0b0101, 0b0110, 0b1001)
  7            # 3 1-bits (0b0111)
]

答案 2 :(得分:0)

如果您的问题是:按整数顺序将整数按其二进制表示形式中的1的数量排序。例如,(7)10→(111)2和(8)10→(1000)2,因此8(其中一个1为二进制)将在7之前排序(其中三个1为二进制

然后,我们可以在python中执行此操作,如下所示。

  

逐步解释

myList = [1,11,7]

# function to get binary 1's
 def get_len_of_ones(val):
    getbinary =lambda val : bin(val)[2:].count('1')
    return getbinary(val)

# mapping function to every element and then zipping it with myList    
myTuple = zip(myList, map(get_len_of_ones,myList))
print myTuple 
Out[1]: [(1, 1), (11, 3), (7, 3)]


# Applying sorting on the second element of the tuple in the List
sortedList = sorted(myTuple , key=lambda tup: tup[1],reverse=True)

print sortedList 
Out[1]: [(11, 3), (7, 3), (1, 1)]

# Unzip myList out and display myList at index 0 and convert to list
print list(zip(*sortedList)[0])
Out[1]: [11, 7, 1]
  

我们可以做pythonic以及

myList = [1,11,7]

# Using get_len_of_ones function from above code

l= lambda x : list(zip(*sorted(zip(x,map(get_len_of_ones,x)), key=lambda tup: tup[1],reverse=True))[0])

l(myList)
Out[1]: [11, 7, 1]

答案 3 :(得分:0)

将熊猫作为pd导入

df = pd.DataFrame([1,2,3,4,5,8],columns = ['Integers'])

def countSetBits(n): 计数= 0 而(n): 计数+ = n&1 n >> = 1 返回计数

df [“ Count_of_set_bits”] = df.apply(lambda x:countSetBits(x ['Integers']),axis = 1)

df ['value'] = df ['Integers']

df = df.sort_values([['Count_of_set_bits','value'],ascending = [True,True])

results = list(df ['Integers'])