[leetcode]Largest Number

本文介绍了一种将整数数组重新排列以形成最大可能整数的方法。通过将整数转换为字符串并定制排序规则实现。具体地,若两字符串s1,s2满足s1+s2>s2+s1,则s1应在s2前。

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

题目如下:

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.

这一题给了一个整数数组,要求我们讲数组里的整数按照一定的方法排列使得最后得到的整数值最大。
我在做这一题的时候没有想到这一题的好的解法,所以采用暴力解法,用了大概1个小时也没有把程序调整好,谷歌了一下,正确的做法应该是将数组进行排序,排序的方法是:对于两个整数字符串s1,s2,如果s1+s2>s2+s1则把s1排到s2的前面。
正确解法给我的启示是,之前我在思考的过程用的笨方法希望通过逐位进行比较来确定那个字符串应该排在前面,不得要领,同时因为我的方法要做很多比较的工作,使用了许多C++的复杂语句,使自己陷入其中。
下面是代码:
//C++
class Solution {
public:
static bool compare(string a, string b){
    if (stol(a + b)>stol(b + a))
        return true;
    else
        return false;}
string largestNumber(vector<int>&num){
    string res;
    vector<string>str;
    for(int i=0;i<num.size();i++){
        str.push_back(to_string(num.at(i)));
    }
    sort(str.begin(),str.end(),compare);
    for (int j = 0; j < str.size(); j++){
        res += str.at(j);
    }
    for (int k = 0; k < res.size(); k++){
        if (res.at(k) != '0'){
             string res1(res.begin() + k, res.end());
             return res1;
        }
    }
    return "0";
}
};
在C++中,string和数值之间可以方便转换,通过使用std::to_string,std::stoi,stol,stoll等函数可以方便的进行转换。
同时在OJ系统中,如果compare函数没有声明为static则会编译报错。

使用python代码可以更为简洁的解决这个问题 :
#python
def Solution:
    def LargestNumber(self,int num[]):
        num=sorted([str(x) for x in num],com=self.compare)
        ans=''.join(num).lstrip('0')
    def compare(self,a,b):
        return[1,-1][a+b>b+a]

### 关于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、付费专栏及课程。

余额充值