2025-05-05:连接二进制表示可形成的最大数值。用go语言,给定一个包含三个整数的数组 nums。
将数组中所有元素的二进制形式以某种顺序拼接起来,要求拼接后的二进制字符串所表示的数值尽可能大。
其中,每个数字的二进制表示不包含前导零。
请你返回通过这种方式能得到的最大数值。
nums.length == 3。
1 <= nums[i] <= 127。
输入: nums = [2,8,16]。
输出: 1296。
解释:
按照顺序 [2, 8, 16] 连接数字的二进制表述,得到结果 "10100010000",这是 1296 的二进制表示。
题目来自leetcode3309。
nums = [2, 8, 16]
:10
(长度 2)1000
(长度 4)10000
(长度 5)[2, 8, 16]
-> "10" + "1000" + "10000"
-> 10100010000
(1296)[2, 16, 8]
-> "10" + "10000" + "1000"
-> 10100001000
(1288)[8, 2, 16]
-> "1000" + "10" + "10000"
-> 10001010000
(1104)[8, 16, 2]
-> "1000" + "10000" + "10"
-> 10001000010
(1090)[16, 2, 8]
-> "10000" + "10" + "1000"
-> 10000101000
(1064)[16, 8, 2]
-> "10000" + "1000" + "10"
-> 10000100010
(1042)10100010000
(1296),对应顺序 [2, 8, 16]
。a
和 b
,比较 (b << lenA | a)
和 (a << lenB | b)
,其中 lenA
和 lenB
分别是 a
和 b
的二进制位数。(b << lenA | a) > (a << lenB | b)
,则 a
应该排在 b
前面,否则 b
排在前面。nums = [2, 8, 16]
:2
和 8
:lenA = 2
, lenB = 4
(8 << 2 | 2) = 32 | 2 = 34
(2 << 4 | 8) = 32 | 8 = 40
34 < 40
,所以 8
应该排在 2
前面。8
和 16
:lenA = 4
, lenB = 5
(16 << 4 | 8) = 256 | 8 = 264
(8 << 5 | 16) = 256 | 16 = 272
264 < 272
,所以 16
应该排在 8
前面。2
和 16
:lenA = 2
, lenB = 5
(16 << 2 | 2) = 64 | 2 = 66
(2 << 5 | 16) = 64 | 16 = 80
66 < 80
,所以 16
应该排在 2
前面。[2, 8, 16]
。[2, 8, 16]
拼接二进制:2
-> 10
8
-> 1000
16
-> 10000
10100010000
。10100010000
-> 1*2^10 + 0*2^9 + 1*2^8 + 0*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0
= 1024 + 256 + 16
= 1296
。1296
。bits.Len
是 O(1) 操作。127
的二进制是 1111111
)。package main
import (
"fmt"
"slices"
"math/bits"
)
func maxGoodNumber(nums []int) (ans int) {
slices.SortFunc(nums, func(a, b int)int {
lenA := bits.Len(uint(a))
lenB := bits.Len(uint(b))
return (b<<lenA | a) - (a<<lenB | b)
})
for _, x := range nums {
ans = ans<<bits.Len(uint(x)) | x
}
return
}
func main() {
nums := []int{2,8,16}
result := maxGoodNumber(nums)
fmt.Println(result)
}
# -*-coding:utf-8-*-
from functools import cmp_to_key
defmax_good_number(nums):
defcompare(a, b):
lenA = a.bit_length()
lenB = b.bit_length()
# 模拟 Go 中位运算构造的比较方式
val1 = (b << lenA) | a
val2 = (a << lenB) | b
# 返回正负决定排序顺序
return val2 - val1 # 因为 Go排序传入返回 a-b,Python中 cmp 返回 <0表示a<b,所以反向用了 val2 - val1
nums.sort(key=cmp_to_key(compare))
ans = 0
for x in nums:
ans = (ans << x.bit_length()) | x
return ans
if __name__ == "__main__":
nums = [2, 8, 16]
result = max_good_number(nums)
print(result)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有