组成最小的数

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。
目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:
给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。
输入描述:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,
顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空
格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出描述:
在一行中输出能够组成的最小的数。
示例1
输入
2 2 0 0 0 3 0 0 1 0

输出
10015558

 

解题思路:找到所给数字中非零并且最小的数,让它为数字最高位,,然后将剩余元素从小到大依次添加。

public class Test1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int[] nums = new int[10];
            for(int i = 0;i<10;i++){
                nums[i] = in.nextInt();
            }
            System.out.println(GetNum(nums));
        }
    }
    public static String GetNum( int[] nums){
        String s = "";
        for(int i = 1; i<10;i++){
            if(nums[i] != 0){
                s += i;
                nums[i] --;
                break;
            }
        }
        for(int i = 0;i<10;i++){
            while(nums[i] != 0){
                s += i;
                nums[i] --;
            }
        }
        return s;
    }
}

 

### 组成最大的算法实现 为了将一组数字组合成可能的最大值,通常采用的方法是对这些数字进行重新排序。具体来说,可以通过比较两个数字的不同拼接顺序来决定它们之间的相对位置。 以下是基于 Python 的一种高效实现方式: #### 方法描述 该方法的核心在于自定义一个比较函 `cmp` 来判断两个字符串形式的数字哪个应该放在前面。对于任意两个数字 \(a\) 和 \(b\),如果 \(ab > ba\) 则 \(a\) 应该排在 \(b\) 前面;反之则 \(b\) 排在 \(a\) 前面[^3]。 ```python from functools import cmp_to_key def largest_number(nums): # 将整转换为字符串以便于拼接 nums = list(map(str, nums)) # 自定义比较函 def compare(x, y): if x + y > y + x: return -1 elif x + y < y + x: return 1 else: return 0 # 使用内置的 sorted 函并传入自定义比较器 nums_sorted = sorted(nums, key=cmp_to_key(compare)) # 如果最高位是 '0',直接返回 '0' if nums_sorted[0] == '0': return '0' # 合并所有字符串得到最终结果 return ''.join(nums_sorted) # 测试用例 if __name__ == "__main__": test_case = [22, 221] result = largest_number(test_case) print(result) # 输出应为 "22221" ``` 以上代码实现了从输入组中找到能构成的最大值的功能。它利用了 Python 的高级特性——`sorted()` 函配合自定义比较逻辑完成排序工作[^4]。 #### 复杂度分析 时间复杂度主要由排序过程决定,假设共有 n 个元素,则平均情况下其时间为 O(n log n),这是因为采用了快速排序或其他高效的内部排序机制[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值