LeetCode 179 Largest Number

问题描述:

给出一个整型数组,所有数字均>=0,问如何组合集中的数字才能形成一个最大的数字。

例如给出:[3, 30, 34, 5, 9], -----> 9534330.

思路:本人从字符串排序的角度考虑,试图将所有数字看成字符串一起去排序,但是过程极其繁琐,放弃。于是考虑从小范围开始排序,不在放眼全局。例如先将前两个3,30进行排序--->可以组成330和303两种,显然选择330这种顺序。再讲第三个数字拿过来,是放在3左边呢,还是放在3和30中间呢,还是放在30后边呢?显然将某数字放在最左侧,表明以这个数字开头的组合是最大的;反之,放在最右侧说明这个数字不合适放在其他所有数字的前边(废话)。

 规律总结为:每拿到一个新数字,遍将它与在它之前的所有已经排好序的数字进行组合后的比较----->这不就是插入排序啊!!!


AC代码:

class Solution {
    public String largestNumber(int[] nums) {
        
        for (int i = 1; i < nums.length; i++) {
            int j = i;
            int temp = nums[j];
            while (j > 0 && (String.valueOf(temp) + String.valueOf(nums[j - 1])).compareTo((String.valueOf(nums[j - 1]) + String.valueOf(temp))) >= 0)
            //System.out.println();
            {
                nums[j] = nums[j - 1];
                j--;
            }
            nums[j] = temp;
        }
        String sum="";
        for (int i = 0; i < nums.length; i++) {
            sum+=String.valueOf(nums[i]);
        }
        if(sum.indexOf("0")==0)sum="0";
        return sum;
    }
}

### 关于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-&#39;0&#39;)%2==0) even.push(c-&#39;0&#39;); // 偶数入even队列 else odd.push(c-&#39;0&#39;); // 奇数入odd队列 } string res = ""; for(auto& c:s){ if ((c - &#39;0&#39;) % 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、付费专栏及课程。

余额充值