Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2025-05-05:连接二进制表示可形成的最大数值。用go语言,给定一个包含三个整数的数组 nums。 将数组中所有元素的二进

2025-05-05:连接二进制表示可形成的最大数值。用go语言,给定一个包含三个整数的数组 nums。 将数组中所有元素的二进

作者头像
福大大架构师每日一题
发布于 2025-05-05 06:12:23
发布于 2025-05-05 06:12:23
7300
代码可运行
举报
运行总次数:0
代码可运行

2025-05-05:连接二进制表示可形成的最大数值。用go语言,给定一个包含三个整数的数组 nums。

将数组中所有元素的二进制形式以某种顺序拼接起来,要求拼接后的二进制字符串所表示的数值尽可能大。

其中,每个数字的二进制表示不包含前导零。

请你返回通过这种方式能得到的最大数值。

nums.length == 3。

1 <= nums[i] <= 127。

输入: nums = [2,8,16]。

输出: 1296。

解释:

按照顺序 [2, 8, 16] 连接数字的二进制表述,得到结果 "10100010000",这是 1296 的二进制表示。

题目来自leetcode3309。

分步骤描述过程:

  1. 1. 理解题目要求
    • • 给定三个整数,需要将它们按某种顺序排列,然后将它们的二进制表示按顺序拼接起来,形成一个更大的二进制数。
    • • 这个拼接后的二进制数不能有前导零(即每个数字的二进制表示本身没有前导零,拼接时也不会引入前导零)。
    • • 目标是找到一种排列顺序,使得拼接后的二进制数对应的十进制值最大。
  2. 2. 示例分析
    • • 输入 nums = [2, 8, 16]
      • • 2 的二进制是 10(长度 2)
      • • 8 的二进制是 1000(长度 4)
      • • 16 的二进制是 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]
  3. 3. 排序策略
    • • 为了找到最优的拼接顺序,需要对三个数字进行排序。
    • • 排序的比较规则是:对于两个数字 ab,比较 (b << lenA | a)(a << lenB | b),其中 lenAlenB 分别是 ab 的二进制位数。
    • • 如果 (b << lenA | a) > (a << lenB | b),则 a 应该排在 b 前面,否则 b 排在前面。
    • • 这种比较规则确保拼接后的二进制数尽可能大。
  4. 4. 排序过程
    • • 对于 nums = [2, 8, 16]
      • • 比较 28
        • lenA = 2, lenB = 4
        • (8 << 2 | 2) = 32 | 2 = 34
        • (2 << 4 | 8) = 32 | 8 = 40
        • 34 < 40,所以 8 应该排在 2 前面。
      • • 比较 816
        • lenA = 4, lenB = 5
        • (16 << 4 | 8) = 256 | 8 = 264
        • (8 << 5 | 16) = 256 | 16 = 272
        • 264 < 272,所以 16 应该排在 8 前面。
      • • 比较 216
        • lenA = 2, lenB = 5
        • (16 << 2 | 2) = 64 | 2 = 66
        • (2 << 5 | 16) = 64 | 16 = 80
        • 66 < 80,所以 16 应该排在 2 前面。
      • • 最终排序顺序:[2, 8, 16]
  5. 5. 拼接二进制
    • • 按排序后的顺序 [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
  6. 6. 计算最终结果
    • • 将排序后的数字依次拼接二进制表示,然后转换为十进制,得到最大值 1296

时间复杂度和额外空间复杂度:

  • 时间复杂度
    • • 排序的时间复杂度:由于只有 3 个数字,排序的比较次数是常数(最多 3 次比较),每次比较的计算也是常数时间(计算位数和移位操作)。
    • • 计算二进制位数的时间:bits.Len 是 O(1) 操作。
    • • 拼接二进制的时间:遍历排序后的数组,拼接操作是常数时间(因为数字的二进制位数最多是 7 位,即 127 的二进制是 1111111)。
    • • 总体时间复杂度是 O(1)(因为输入规模固定为 3)。
  • 额外空间复杂度
    • • 排序可能需要 O(1) 的额外空间(原地排序)。
    • • 没有使用额外的数据结构,空间复杂度是 O(1)。

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
}

Python完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*-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)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2025-06-05:统计小于 N 的 K 可约简整数。用go语言,给定一个二进制字符串 s,它表示一个整数 n 的二进制形式。
2025-06-05:统计小于 N 的 K 可约简整数。用go语言,给定一个二进制字符串 s,它表示一个整数 n 的二进制形式。
福大大架构师每日一题
2025/06/06
130
2025-06-05:统计小于 N 的 K 可约简整数。用go语言,给定一个二进制字符串 s,它表示一个整数 n 的二进制形式。
2025-06-03:检测相邻递增子数组Ⅱ。用go语言,给定一个包含 n 个整数的数组 nums,要求找出一个最大的整数 k,使
2025-06-03:检测相邻递增子数组Ⅱ。用go语言,给定一个包含 n 个整数的数组 nums,要求找出一个最大的整数 k,使得数组中存在两个连续且长度均为 k 的子数组,它们都是严格递增的。具体要求如下:
福大大架构师每日一题
2025/06/06
270
2025-06-03:检测相邻递增子数组Ⅱ。用go语言,给定一个包含 n 个整数的数组 nums,要求找出一个最大的整数 k,使
【LeetCode第20场夜猫赛】5323. 根据数字二进制下 1 的数目排序
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
韩旭051
2020/06/23
3740
【小Y学算法】⚡️每日LeetCode打卡⚡️——20.二进制求和
本文章是⭐️小Y学算法⭐️的内容,该专栏还有多篇优质内容在等待你观看,现在点击右上角点击这个————????订阅专栏???? 就可以免费观看多篇相关内容的文章啦! ????前言 ????原题样例 ?
呆呆敲代码的小Y
2021/09/03
2760
【小Y学算法】⚡️每日LeetCode打卡⚡️——20.二进制求和
2025-01-21:使二进制数组全部等于 1 的最少操作次数Ⅰ。用go语言,给定一个二进制数组 nums,你可以进行以下操作任
2025-01-21:使二进制数组全部等于 1 的最少操作次数Ⅰ。用go语言,给定一个二进制数组 nums,你可以进行以下操作任意次数(包括0次):
福大大架构师每日一题
2025/01/22
570
2025-01-21:使二进制数组全部等于 1 的最少操作次数Ⅰ。用go语言,给定一个二进制数组 nums,你可以进行以下操作任
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次):
福大大架构师每日一题
2025/01/23
790
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下
2025-05-09:构造最小位运算数组Ⅰ。用go语言,给定一个长度为 n 的质数数组 nums,要求构造一个同样长度为 n 的
2025-05-09:构造最小位运算数组Ⅰ。用go语言,给定一个长度为 n 的质数数组 nums,要求构造一个同样长度为 n 的数组 ans,使得对于每个索引 i,满足以下条件:
福大大架构师每日一题
2025/05/09
500
2025-05-09:构造最小位运算数组Ⅰ。用go语言,给定一个长度为 n 的质数数组 nums,要求构造一个同样长度为 n 的
一道LeetCode题带我们深入二进制表示、搜索策略和剪枝
给定一个int类型的候选集,和一个int类型的target,要求返回所有的数字组合,使得组合内所有数字的和刚好等于target。
TechFlow-承志
2020/03/19
4510
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。 定义“因子得分”为该数组中所有元素的最小公倍
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。
福大大架构师每日一题
2025/05/23
280
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。 定义“因子得分”为该数组中所有元素的最小公倍
2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。 你可以执行以下操作: 如果两个相邻元素的二
2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。
福大大架构师每日一题
2024/05/27
1110
2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。 你可以执行以下操作: 如果两个相邻元素的二
2024-05-15:用go语言,考虑一个整数 k 和一个整数 x。 对于一个数字 num, 在其二进制表示中, 从最低有效位开
又如,当x=2,num=13,二进制表示依然为000001101,但对应的价值是1。
福大大架构师每日一题
2024/05/17
1230
2024-05-15:用go语言,考虑一个整数 k 和一个整数 x。 对于一个数字 num, 在其二进制表示中, 从最低有效位开
2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素
2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k,
福大大架构师每日一题
2024/08/16
760
2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,如果我们可以对其中一个数执行至多两次操作,使得它们变得相等。这些操作包括选择 x 或 y 中的一个,交换这个数字的两个数位。
福大大架构师每日一题
2025/04/04
820
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,
从二进制枚举 follow up 到二分图判定,有点意思
不过我在评论区看到有人提到了 T4 对应的 follow-up 题,是 codeforces div2 的 D 题,涉及到了图论建模和二分图判定,一起来看一看吧
ACM算法日常
2022/02/10
3980
2024-12-08:找出所有稳定的二进制数组 Ⅱ。用go语言,请实现一个函数,接收三个正整数 zero、one 和 limit
2024-12-08:找出所有稳定的二进制数组 Ⅱ。用go语言,请实现一个函数,接收三个正整数 zero、one 和 limit 作为输入。函数的任务是计算符合以下条件的稳定二进制数组的数量:
福大大架构师每日一题
2024/12/09
700
2024-12-08:找出所有稳定的二进制数组 Ⅱ。用go语言,请实现一个函数,接收三个正整数 zero、one 和 limit
2024-12-07:找出所有稳定的二进制数组 Ⅰ。用go语言,给定三个正整数 zero、one 和 limit,定义一个稳定的
2024-12-07:找出所有稳定的二进制数组 Ⅰ。用go语言,给定三个正整数 zero、one 和 limit,定义一个稳定的二进制数组需要满足以下条件:
福大大架构师每日一题
2024/12/09
790
2024-12-07:找出所有稳定的二进制数组 Ⅰ。用go语言,给定三个正整数 zero、one 和 limit,定义一个稳定的
2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 num
Alice可以选择任何索引 aliceIndex,如果对应的 nums[aliceIndex] 是1,Alice会拾取一个1并将其设为0。
福大大架构师每日一题
2024/10/14
760
2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 num
2025-03-08:使两个整数相等的位更改次数。用go语言,给定两个正整数 n 和 k。 你可以从 n 的二进制表示中选择任意
2025-03-08:使两个整数相等的位更改次数。用go语言,给定两个正整数 n 和 k。
福大大架构师每日一题
2025/03/10
670
2025-03-08:使两个整数相等的位更改次数。用go语言,给定两个正整数 n 和 k。 你可以从 n 的二进制表示中选择任意
动态规划——用二进制表示集合的状态压缩DP
今天文章的内容是动态规划当中非常常见的一个分支——状态压缩动态规划,很多人对于状态压缩畏惧如虎,但其实并没有那么难,希望我今天的文章能带你们学到这个经典的应用。
TechFlow-承志
2020/04/20
8420
【小Y学算法】每日LeetCode打卡——20.二进制求和
整体思路是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。
呆呆敲代码的小Y
2022/05/10
3130
【小Y学算法】每日LeetCode打卡——20.二进制求和
推荐阅读
2025-06-05:统计小于 N 的 K 可约简整数。用go语言,给定一个二进制字符串 s,它表示一个整数 n 的二进制形式。
130
2025-06-03:检测相邻递增子数组Ⅱ。用go语言,给定一个包含 n 个整数的数组 nums,要求找出一个最大的整数 k,使
270
【LeetCode第20场夜猫赛】5323. 根据数字二进制下 1 的数目排序
3740
【小Y学算法】⚡️每日LeetCode打卡⚡️——20.二进制求和
2760
2025-01-21:使二进制数组全部等于 1 的最少操作次数Ⅰ。用go语言,给定一个二进制数组 nums,你可以进行以下操作任
570
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下
790
2025-05-09:构造最小位运算数组Ⅰ。用go语言,给定一个长度为 n 的质数数组 nums,要求构造一个同样长度为 n 的
500
一道LeetCode题带我们深入二进制表示、搜索策略和剪枝
4510
2025-05-23:数组的最大因子得分。用go语言,给定一个整数数组 nums。 定义“因子得分”为该数组中所有元素的最小公倍
280
2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。 你可以执行以下操作: 如果两个相邻元素的二
1110
2024-05-15:用go语言,考虑一个整数 k 和一个整数 x。 对于一个数字 num, 在其二进制表示中, 从最低有效位开
1230
2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素
760
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,
820
从二进制枚举 follow up 到二分图判定,有点意思
3980
2024-12-08:找出所有稳定的二进制数组 Ⅱ。用go语言,请实现一个函数,接收三个正整数 zero、one 和 limit
700
2024-12-07:找出所有稳定的二进制数组 Ⅰ。用go语言,给定三个正整数 zero、one 和 limit,定义一个稳定的
790
2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 num
760
2025-03-08:使两个整数相等的位更改次数。用go语言,给定两个正整数 n 和 k。 你可以从 n 的二进制表示中选择任意
670
动态规划——用二进制表示集合的状态压缩DP
8420
【小Y学算法】每日LeetCode打卡——20.二进制求和
3130
相关推荐
2025-06-05:统计小于 N 的 K 可约简整数。用go语言,给定一个二进制字符串 s,它表示一个整数 n 的二进制形式。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档