class Solution {
public:
int maxGoodNumber(vector<int>& nums) {
}
};
3309. 连接二进制表示可形成的最大数值
给你一个长度为 3
的整数数组 nums
。
现以某种顺序 连接 数组 nums
中所有元素的 二进制表示 ,请你返回可以由这种方法形成的 最大 数值。
注意 任何数字的二进制表示 不含 前导零。
示例 1:
输入: nums = [1,2,3]
输出: 30
解释:
按照顺序 [3, 1, 2]
连接数字的二进制表示,得到结果 "11110"
,这是 30 的二进制表示。
示例 2:
输入: nums = [2,8,16]
输出: 1296
解释:
按照顺序 [2, 8, 16]
连接数字的二进制表述,得到结果 "10100010000"
,这是 1296 的二进制表示。
提示:
nums.length == 3
1 <= nums[i] <= 127
相似题目
原站题解
cpp 解法, 执行用时: 0 ms, 内存消耗: 23.9 MB, 提交时间: 2024-10-09 21:59:04
class Solution { public: int maxGoodNumber(vector<int>& nums) { ranges::sort(nums, [](int a, int b) { int len_a = __lg(a) + 1; int len_b = __lg(b) + 1; return (a << len_b | b) > (b << len_a | a); }); int ans = 0; for (int x : nums) { ans = ans << (__lg(x) + 1) | x; } return ans; } };
java 解法, 执行用时: 2 ms, 内存消耗: 40.8 MB, 提交时间: 2024-10-09 21:58:48
class Solution { public int maxGoodNumber(int[] nums) { // Integer[] arr = Arrays.stream(nums).boxed().toArray(Integer[]::new); Integer[] arr = new Integer[]{nums[0], nums[1], nums[2]}; Arrays.sort(arr, (a, b) -> { int lenA = 32 - Integer.numberOfLeadingZeros(a); int lenB = 32 - Integer.numberOfLeadingZeros(b); return (b << lenA | a) - (a << lenB | b); }); int ans = 0; for (int x : arr) { int lenX = 32 - Integer.numberOfLeadingZeros(x); ans = ans << lenX | x; } return ans; } }
golang 解法, 执行用时: 0 ms, 内存消耗: 2.2 MB, 提交时间: 2024-10-09 21:58:22
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 }
python3 解法, 执行用时: 27 ms, 内存消耗: 16.5 MB, 提交时间: 2024-10-09 21:58:03
class Solution: def maxGoodNumber(self, nums: list[int]) -> int: def cmp(a: int, b: int) -> int: len_a = a.bit_length() len_b = b.bit_length() return (b << len_a | a) - (a << len_b | b) nums.sort(key=cmp_to_key(cmp)) ans = 0 for x in nums: ans = ans << x.bit_length() | x return ans