码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode]Largest Number

时间:2015-02-14 22:38:45      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

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.

这道题要求,给定一个数组,将数组中的元素连接在一起,组成更大的数,求能组成的最大的数。由于组成的数可能很大,所以结果用字符串返回。

在解题的过程中,我傻缺了两次/(ㄒoㄒ)/~~。第一次,没正确审题,直接统计出所有数字的频率,然后由大到小拼接,没注意到一个数是不可以拆分的!第二次,不说了,说多了都是泪,直接上图,铭记自己的蠢…
技术分享

那么正确的解法是什么呢?
一开始想的是,比较直观的若一个数的较高位大于其他数,那么它肯定越靠前。比如9和34比较,9大于3,那么9就应该在34前面。首先我直接将数转换为字符串,然后使用strcmp判断两个字符串的大小来决定谁前谁后,后来发现不对,因为比如3和30,“30”是大于“3”的,但是“303”比“330”小。所以后来就一直陷在多种情况的讨论中。
最后换了个思路,直接比较两个数不同组合的大小,比如比较3和34的先后位置,可以直接比较334和343的大小。然后用这个方法对整个数组进行排序,最后把排好序的数拼接在一起就可以了。
下面贴上代码:

class Solution {
public:
    string largestNumber(vector<int> &num){
        string ans;
        if (num.size() < 1)
            return ans;
        stringstream pre, post;
        for (int i = 1; i < num.size(); i++){
            for (int j = 0; j < i; j++){
                pre << num[j];
                post << num[i];
                if (pre.str() + post.str() < post.str() + pre.str()){
                    int temp = num[i];
                    num.erase(num.begin() + i);
                    num.insert(num.begin() + j, temp);
                    pre.str("");
                    post.str("");
                    break;
                }
                pre.str("");
                post.str("");
            }
        }
        for (int k = 0; k < num.size(); k++){
            pre << num[k];
            ans += pre.str();
            pre.str("");
        }
        return  ans[0]==‘0‘?"0":ans;
    }
};

[LeetCode]Largest Number

标签:

原文地址:http://blog.csdn.net/kaitankedemao/article/details/43820775

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!