拼数(一般贪心)

给定一定数量的正整数,需要按照字典序排序后连接成一个最大的多位整数。关键在于正确排序这些数字,可以转换为字符串来比较大小。

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题号:NC16783
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613

输入描述:

第一行,一个正整数n。
第二行,n个正整数。

输出描述:

一个正整数,表示最大的整数

示例1

输入

3
13 312 343

输出

34331213

示例2

输入

20
921650139 925571586 931563581 923960668 870548039 358493469 371229218 737101511 514654859 185379933 19421244 117259400 301947570 48520742 79303948 222979736 153546206 250582036 106394401 198125223

输出

931563581925571586923960668921650139870548039793039487371015115146548594852074237122921835849346930194757025058203622297973619812522319421244185379933153546206117259400106394401

说明

本样例为牛客补充,非原始题目数据。此样例也添加到了本题的测试数据。

2023/1/16添加,之前的提交不进行重测。

关键在于如何去排序,将数字转化为字符串,判断a+b和b+a的大小

也就是字典序排序

 

### 贪心算法解决最小删除问题的解决方案 贪心算法的核心思想是通过局部最优解来逐步构建全局最优解。在最小删除问题中,目标是从一个字序列中删除指定量的字,使得剩余字组成的值尽可能小。以下是对该问题的详细分析和代码实现。 #### 问题描述 给定一个字符串形式的字序列 `num` 和一个整 `k`,要求从 `num` 中删除 `k` 个字,使得剩下的字组成的值最小。注意,不能改变字的相对顺序[^2]。 #### 算法思路 为了使最终结果尽可能小,可以采用贪心策略: 1. 遍历字序列中的每个字。 2. 如果当前字小于栈顶字,并且还可以继续删除(即 `k > 0`),则弹出栈顶字。 3. 将当前字压入栈中。 4. 如果遍历结束后仍然有未使用的删除次,则从栈尾继续删除多余的字。 5. 最后将栈中的接成字符串并返回。 这种贪心策略保证了每次删除时都能选择当前最优解,从而避免了回溯的复杂性[^2]。 #### 代码实现 以下是基于上述思路的 Python 实现: ```python def removeKdigits(num: str, k: int) -> str: stack = [] for digit in num: while k > 0 and stack and stack[-1] > digit: stack.pop() k -= 1 stack.append(digit) # 如果仍有剩余的删除次,从栈尾删除 while k > 0: stack.pop() k -= 1 # 移除前导零并返回结果 result = ''.join(stack).lstrip('0') return result if result else "0" ``` #### 示例运行 假设输入为 `num = "1432219"` 和 `k = 3`,执行过程如下: 1. 初始化栈为空:`stack = []`。 2. 遍历每个字: - 当前字为 `1`,直接压入栈:`stack = ['1']`。 - 当前字为 `4`,直接压入栈:`stack = ['1', '4']`。 - 当前字为 `3`,`4 > 3`,弹出 `4` 并压入 `3`:`stack = ['1', '3']`。 - 当前字为 `2`,`3 > 2`,弹出 `3` 并压入 `2`:`stack = ['1', '2']`。 - 当前字为 `2`,直接压入栈:`stack = ['1', '2', '2']`。 - 当前字为 `1`,`2 > 1`,弹出两个 `2` 并压入 `1`:`stack = ['1', '1']`。 - 当前字为 `9`,直接压入栈:`stack = ['1', '1', '9']`。 3. 删除完成后,移除前导零并返回结果:`result = "119"`。 #### 时间复杂度与空间复杂度 - **时间复杂度**:O(n),其中 n 是字序列的长度。每个字最多进栈和出栈一次。 - **空间复杂度**:O(n),用于存储栈中的字。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值