184.Largest Number-最大数(中等题)

本文介绍了一种将非负整数数组重新排列以形成最大整数的方法。通过将整数转为字符串,并自定义排序规则,实现了高效组合。具体实现采用Java语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大数

  1. 题目

    给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。

    注意事项
    最后的结果可能很大,所以我们返回一个字符串来代替这个整数。

  2. 样例

    给出 [1, 20, 23, 4, 8],返回组合最大的整数应为8423201。

  3. 挑战

    在 O(nlogn) 的时间复杂度内完成。

  4. 题解

    本题很容易想到先排序数组再组合成最大数。难点就在于在排序中如何进行大小判断。
    1.如果两个数长度相同,则只需从高位到低位依次比较就可以了,如果第一位相同的情况出现那么再看第二位,即45应在40之前。如果位数不等,如4应当放在40和45之前、之后还是中间。由于高位都是4,而40的低位是0,45的低位是5,4的低位是4,所以顺序应该是45,4,40。这个方法处理起来比较繁琐。
    2.可以直接比较两个数不同组合的大小。如比较4和45可以通过比较445和454的大小来确认4和45的先后位置。但在数字较大时会溢出,而且LintCode好似无法使用BigDecimal,所以该方法也无法使用。
    3.利用2的思路,我们可以将整型数组转换成字符串数组,对字符串”445”和”454”进行比较,简答且无溢出问题。

public class Solution {
    /**
     *@param num: A list of non negative integers
     *@return: A string
     */
    public String largestNumber(int[] num) {
        String[] A = new String[num.length];
        int max = 0;
        for (int i=0;i<num.length;i++)
        {
            A[i] = String.valueOf(num[i]);
            max = Math.max(max,num[i]);
        }
        if (max == 0)
        {
            return "0";//如果数组中数字全部是0则无需进行组合
        }
        Arrays.sort(A,new Comparator<String>()
        {
            @Override
            public int compare(String o1, String o2)
            {
                return (o2+o1).compareTo(o1+o2);
            }
        });
        StringBuilder sb = new StringBuilder();
        for (int i=0;i<num.length;i++)
        {
            sb.append(String.valueOf(A[i]));
        }
        return sb.toString();
    }
}

Last Update 2016.10.26

<think>我们有两个主要需求: 1. 将整数转换为二进制字符串(可能带前缀或不带前缀) 2. 将整数转换为二进制数组(即由0和1组成的列表) 根据引用[1]和引用[2]提供的方法,我们可以使用内置函数`bin()`,但注意它会返回带有'0b'前缀的字符串。 另外,我们也可以使用格式化字符串的方法。 对于二进制数组,我们可以将得到的二进制字符串(去掉前缀)转换为一个整数列表,每个元素代表一个二进制位。 步骤: 1. 转换整数为二进制字符串(可选择是否包含前缀)。 2. 如果需要去掉前缀,则去掉前两个字符。 3. 将字符串的每个字符转换为整数,形成数组。 另外,我们还可以使用位运算的方法来构建数组,但这里我们主要参考引用中的方法。 方法一:使用bin()函数 方法二:使用格式化字符串:format(number, 'b') 或者 f-string: f"{number:b}" 示例1:转换为二进制字符串(不带前缀) 示例2:转换为二进制数组 另外,注意负数的情况。在Python中,bin(-10)会输出'-0b1010'。对于负数,我们可能需要考虑使用补码表示,但通常的转换是针对非负整数的。 如果用户需要处理负数,则需要额外说明。根据问,用户只提到整数,但未说明正负,这里我们先按非负数处理,若需负数则需扩展。 但问中用户没有特别说明负数,我们先按非负数处理。 步骤: 1. 将整数转换为二进制字符串(不带前缀)。 2. 将字符串中的每个字符('0'或'1')转换为整数(0或1)并放入列表。 另外,我们还可以使用位操作来逐位获取二进制位,但这里先使用字符串转换的方法。 代码示例:</think>在 Python 中将整数转换为二进制表示有多种方法,以下是最常用的几种实现方式,参考了站内引用内容[^1][^2][^3]: ### 方法 1:使用内置函数 `bin()`(带前缀) ```python num = 42 binary_str = bin(num) # 返回带'0b'前缀的字符串 print(binary_str) # 输出: '0b101010' ``` ### 方法 2:使用格式化字符串(无前缀) ```python binary_str = format(num, 'b') # 直接返回二进制字符串 print(binary_str) # 输出: '101010' # 或使用 f-string binary_str = f"{num:b}" # Python 3.6+ print(binary_str) # 输出: '101010' ``` ### 方法 3:转换为二进制数组(列表形式) ```python # 方法 3.1:通过字符串转换 binary_array = [int(bit) for bit in format(num, 'b')] print(binary_array) # 输出: [1, 0, 1, 0, 1, 0] # 方法 3.2:使用位运算(更高效) def int_to_binary_array(n): return [1 if n & (1 << i) else 0 for i in range(n.bit_length()-1, -1, -1)] print(int_to_binary_array(42)) # 输出: [1, 0, 1, 0, 1, 0] ``` ### 特殊处理技巧 1. **固定位数填充**: ```python padded_binary = format(num, '08b') # 填充到8位 print(padded_binary) # 输出: '00101010' ``` 2. **处理负数**(使用补码表示): ```python negative_num = -42 # 转换为32位补码表示 twos_complement = bin(negative_num & 0xffffffff)[2:].zfill(32) print(twos_complement) # 输出: '11111111111111111111111111010110' ``` 3. **字符串数字转二进制**(参考引用[^2]): ```python a_str, b_str = "10", "11" # 二进制字符串 result = bin(int(a_str, 2) + int(b_str, 2))[2:] print(result) # 输出: '101' ``` ### 性能比较 | 方法 | 适用场景 | 特点 | |------|----------|------| | `bin()` | 快速查看 | 带前缀,需切片处理 | | `format()` | 格式化输出 | 灵活控制位数和格式 | | 位运算 | 高性能需求 | 直接操作比特位,效率最高 | | 列表推导 | 需要数组形式 | 直观但效率中等 | > 对于大多数应用,推荐使用 `format(num, 'b')` 或 f-string 方法,它们简洁高效且无需处理前缀[^1]。当需要操作单个比特位时,位运算方法是最佳选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值