算法设计与分析课作业【week8】leetcode--179. Largest Number

题目

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

Example 1:

Input: [10,2]
Output: "210"

Example 2:

Input: [3,30,34,5,9]

Output: "9534330"

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

题目的要求是将一个整数数组的数进行组合,形成一个最大的整数,这个整数可以非常大,所以单纯的int、long long int也可能放不下,需要返回一个字符串来代替。

这个题目的关键是如何将整数要如何组合才能是最大的数,我们考虑组合的方式,当两个整数想要组成最大的数的话,很明显哪个整数的最高位最大,哪个整数就要放在前面。

但要是两个整数的最高位一样大,我们就需要比较接下来的位数,这样想直接用整数来比较就得一位一位来很麻烦,那我们可以想到string类型也是可以直接比较的,在本题中,将整数转为string类型来比较时就会变得很方便。

但同时,转为string类型进行比较也存在着一个问题,当整数的位数不同且最高位相同,string的比较就会没办法确定哪个先哪个后了,但是string有加法呀,既然不能确定哪个先哪个后,那我直接把这两个先后加起来比较不就好了。

假设有两个string a和b,我们就直接将a + b 和b + a进行比较就行了。

这样我们基本就完成了,再利用一下C++中的sort函数,将所有的串进行比较排序,这样从头到尾加起来便是一个最大的整数了。

不过最后我们还要注意的一点是,万一给出的数组很坑,数组中的数全是0,那这样我们将串加起来的结果就会是0000……,这样结果就不对了,应该直接返回0就好了,所以我们最后需要判断一下得到的串的第一个字符是不是0,如果是,那也就是说之后的数不会存在比0还大的数,不然0就不可能在串的第一个,所以只要是就直接返回“0”就行了。这也是leetcode上我没考虑到所以出现的错误情况,为此做下提醒。

C++代码如下:

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> str_nums;
        for (int i = 0; i < nums.size(); ++i) {
            str_nums.push_back(to_string(nums[i]));
        }
        sort(str_nums.begin(), str_nums.end(), Compare);
        string result_str;
        for(int i = 0; i < str_nums.size(); ++i) {
            result_str += str_nums[i];
        }
        return result_str[0] == '0' ? "0" : result_str;
    }
    /*该自定比较函数在leetcode上需要声明为static, 某些平台或许不用,
      虽然官方文档没有说明,但很多平台还是有这个要求,可能是为了避免this的指向错误吧*/
    static int Compare(string& a, string& b) {
        return a + b > b + a;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值