具有相同数量的" 1" s的数字应按十进制表示排序。
例如:
srt([3,7,8,9]) => [8,3,9,7] # 1000, 11, 1001, 111
答案 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'])