[leetcode] Largest Number

Problem Description:

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

太久没有做题,拿到问题后就写代码,总是漏洞百出。

刚看到这个题目时我的想法是,自己定义一个满足题目要求的比较函数,然后对整个数组进行排序即可。这个思路大体上是对的,但是仍有很多细节需要注意。

首先,我曾单纯地以为一个直接按照string的方式比较这些数字就可以满足题目的要求,但是发现不对劲的是,按照题目意思“9”和“98”相比应该“9”更大。于是我就把两个数字先转换成组成它们每位数字的数组,然后自己写了一个满足上述那种情况的比较函数。

然而,事情似乎并没有这么简单,另外一个例子完全证明了上面的比较方法是错误的,那就是“21”和“212”。如果按照长度短的更大的规则,即“9”比“98”大的话,那“21”就比“212”大,这两个数字得到的largest number就是“21212”,可是很明显“21221”会更大。

看完这个例子,我就豁然开朗了,上面的比较方法完全是错误的,我们可以把两个字符串拼接起来进行比较。即num1表示成字符串“a1a2...ai”,num2表示成字符串“b1b2...bj”,我们把num1和num2的比较定义为“a1a2...aib1b2...bj”和“b1b2...bja1a2...ai”的比较即可。

最后,还有一个特例需要处理。因为题目要求最后返回的是一个number,所以“00”是不符合要求的。我又愚蠢地去遍历最后返回的结果,把前面多余的0全部去掉。后来才发现,只要第一个数字是0的话,直接返回“0”好了,因为0的后面不可能有更大的数字了,我在愚蠢的遍历时还以为会出现“00123”呢!(⊙﹏⊙)b

### 关于LeetCode Problem 2264 对于编号为2264的问题,即最大重叠区间数量(Maximum Width of Binary Tree),实际上该描述并不完全匹配问题2264。根据最新的LeetCode题目列表,编号2264对应的是“字符串中的最大数字”(Largest Number After Digit Swaps by Parity)[^1]。 此问题要求给定一个整数`num`,返回通过交换任意次数的奇偶位置上的数字所能得到的最大整数值。注意这里的奇偶是指索引位置而非数字本身的奇偶性。例如,在十进制表示下,最右边的位置视为索引0(偶数),其左边紧邻的位置则为索引1(奇数),以此类推。 #### 解决方案概述 为了实现这一目标,可以采用如下策略: - 将输入整数转换成字符数组以便逐位处理。 - 创建两个优先队列分别用于存储位于奇数和偶数索引处的数字。 - 对原数组遍历一次填充上述两个优先队列,并保持各自内部降序排列。 - 再次遍历时从这两个队列取出顶部元素按原始顺序重新构建结果字符串,确保每次取自相应类型的索引对应的堆顶元素。 - 最终将重组后的字符序列转回整型作为输出。 下面是具体的C++代码实现方式: ```cpp class Solution { public: int largestInteger(int num) { string s = to_string(abs(num)); // 转换成绝对值并转化为字符串形式 priority_queue<int> odd, even; for(char c : s){ if((c-'0')%2==0) even.push(c-'0'); // 偶数入even队列 else odd.push(c-'0'); // 奇数入odd队列 } string res = ""; for(auto& c:s){ if ((c - '0') % 2 == 0) { res += to_string(even.top()); even.pop(); } else { res += to_string(odd.top()); odd.pop(); } } return stoi(res)*(num>=0?1:-1); } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值