[LeetCode 179] Largest Number

90 篇文章 0 订阅

原文地址:http://www.w2bc.com/Article/19411

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.

我:此题借鉴的解法,代码风格是新版C++标准的风格。

思路:

贪心算法:

贪心思路:对于两个备选数字a和b, 如果str(a) + str(b) > str(b) + str(b), 则a在b之前,否则b在a之前,按照这个原则对原数组从大到小排序即可。我们只需要写出sort函数的自定义比较函数即可,注意的是,这里比较函数必须为静态函数。还有我们,要注意一个特殊情况,如果字符串后的字符串从0开始,我们返回“0”。

贪心思路是比较简单的方法,如果我们将数字转成字符串,然后从左到右逐个字符比较,前缀相同的话,还有很多其他情况需要考虑。而利用一个自定义比较函数,对所有字符进行比较,就可以得到正确结果。

首先,我们将num转成字符串存入数组,然后根据自定义比较函数排序,之后再对排序后的字符串连接成一个字符串,最后排除特殊情况,得到所求结果。

Attention:

1. 注意特殊情况,如果字符串开头含0,最后返回“0”

2. sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错。Line 26: invalid use of non-static member function

因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。

//自定义比较函数 
    static bool compare(string &s1, string &s2)
    {
        return s1 + s2 > s2 + s1;
    }

3. sort 比较函数

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
比较函数必须在第一个参数被认为小于,等于或大于第二个参数时分别返回一个小于,等于或大于零的整数。以此来表示两个参数的关系。成功返回true, 失败返回false.

复杂度:O(nlg(n)) 排序算法复杂度

AC Code:

class Solution {
public:
    string largestNumber(vector<int> &num) {
        vector<string> arr;
        
        //将num转成string存入数组
        for(int i : num)
            arr.push_back(to_string(i));
            
        //比较排序
        sort(arr.begin(), arr.end(), compare);
        
        //连接成字符串
        string ret;
        for(string s : arr)
            ret += s;
        
        //排除特殊情况
        if(ret[0] == '0' && ret.size() > 0) 
            return "0";
        
        return ret;
    }
    
private:
    //自定义比较函数 
    static bool compare(string &s1, string &s2)
    {
        return s1 + s2 > s2 + s1;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值