题目如下:

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.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

分析如下:

先看几个例子

eg1. [0, 0, 0 , 0] ->  0

eg2. [1211, 12] -> 121211而不是121112。

所以可以考虑排序,而排序的根据(也就是比较函数的比较原理)不是这些数的值的相对大小,而是它们构成新的数的大小比较。

所以,虽然1211 > 12, 但是

"1211" + "12" = "121112",

“12” + "1211" = "121211",

"121112" < "121211"

所以从构成新的数的角度来看, "1211" < "12" 。

我的代码:

//13ms
struct {bool operator()(string a, string b){string c1 = a + b;string c2 = b + a;return c1 > c2;}
} compareDigits;class Solution {
public:string largestNumber(vector<int> &num) {if (num.size() == 0) return "";vector<string> num_str;for (int i = 0; i < num.size(); ++i) {num_str.push_back(to_string(num[i]));}std::sort(num_str.begin(), num_str.end(), compareDigits);string res1 = "";for (int i = 0; i < num_str.size(); ++i)res1 += num_str[i];if (res1[0] == '0')return "0";elsereturn res1;}
};

小结扩展:

1 比较函数的写法,注意比较函数中的等号的处理。

一开始的错误写法如下,

struct {bool operator()(string a, string b){string c1 = a + b;string c2 = b + a;for (int j = 0; j < c1.length(); ++j) {if (c1[j] < c2[j])return false;else //错误,这里的else必须只能表示">"不能表示">=" 。因为这里的比较函数是对"<"写的。"="和">"都是false。return true;}return false;}
} compareDigits;

修改后为,

struct {bool operator()(string a, string b){string c1 = a + b;string c2 = b + a;for (int j = 0; j < c1.length(); ++j) {if (c1[j] < c2[j])return false;else if (c1[j] > c2[j])return true;}return false; //"="的case, 因为operator()表示小于,所以">" 或者 "="都为false;}
} compareDigits;

再简化一下,就是。

struct {bool operator()(string a, string b){string c1 = a + b;string c2 = b + a;return c1 > c2;}
} compareDigits;

2  另外一种思路。

上面的思路是O(NlgN),下面看另外一种思路虽然是O(N²), 但也不错,挑玉米算法。

class Solution {
public:string largestNumber(vector<int> &num) {string str = "";while(!num.empty()){int n = num.size();  int j = 0;int vv = num[j];for(int i=1;i!=n;i++){int uu = num[i];uu = num[i];vv = num[j];if(uu != vv)if(to_string(uu)+to_string(vv)>to_string(vv)+to_string(uu)){j=i; //j保持当前的"最大"string, "最大"在这里不是指它本身最大,而是指,如果它能够合成最大的数。}}str += to_string(num[j]);num.erase(num.begin()+j);}while(str[0]=='0'&&str.size()>1) str.erase(str.begin());return str;}
};

LeetCode(179) Largest Number相关推荐

  1. [LeetCode]179. Largest Number

    [LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...

  2. Leetcode 179 Largest Number

    Leetcode 179 Largest Number 题目 思路 代码 优化 题目 Given a list of non negative integers, arrange them such ...

  3. [LeetCode]179.Largest Number

    [题目] Given a list of non negative integers, arrange them such that they form the largest number. For ...

  4. [leetcode]179 Largest Number

    问题描述: Given a list of non negative integers, arrange them such that they form the largest number. Fo ...

  5. [leetcode] 179 Largest Number

    拿到这个题的第一个想法是 将int转换成string,然后按照string的比较规则,但是发现  13<3<34这种不好处理. 那么何不我们直接比较下两者的组合,取其较大的呢,由此自定义优 ...

  6. LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...

  7. 179 Largest Number

    题目链接:https://leetcode.com/problems/largest-number/ 题目: Given a list of non negative integers, arrang ...

  8. largest number java_将给定的数组组成最大的数 Largest Number

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

  9. LeetCode——Kth Largest Element in an Array

    LeetCode--Kth Largest Element in an Array Question Find the kth largest element in an unsorted array ...

最新文章

  1. python3.6.1安装教程-在Linux上安装Python3.6.1
  2. [学习笔记]树上莫队
  3. 怎么计算开学第几周php,如何计算开学第几周, 要求每年通用
  4. 在html页面中加入矢量图,HTML5画布矢量图形?
  5. ASP.NET MVC动态加载数据
  6. 为sharepoint 2013 增加切换账户登陆菜单
  7. 腾讯视频中如何把视频进行收藏
  8. 深度学习——第一次浪潮、寒冬及解冻
  9. React Native :加载新闻列表
  10. 联网生活方式下,消费者的7大关键需求
  11. lua与python结合_从Python到Lua
  12. 【优化求解】基于matlab改进的遗传算法求解考虑环境效益DG优化问题【含Matlab源码 1483期】
  13. C语言深度剖析-----数组基础
  14. 信贷风控四:高校地址自动化识别
  15. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-链表
  16. 「游戏引擎 浅入浅出」项目介绍
  17. 【教程篇】Blender实例教程(一)——制作一个酷炫的三叶草星
  18. KANO模型以及产品经理的素质模型
  19. java B2B2C源码电子商务平台-配置中心svn示例和refresh
  20. android商城首页布局,Android使用分类型RecyclerView仿各大商城首页

热门文章

  1. 少年,离regional还有两个周
  2. 宋体测试液晶屏测试小程序
  3. 单片机中动态数码管闪烁问题
  4. 【SQL Server】模糊查询
  5. latex 字母上面加符号
  6. 万字长文读透 Redis
  7. vue-easy-print批量分页打印
  8. Windows10修改Users下的用户文件夹名
  9. $('.test:hiden');和$('.test :hiden);区别
  10. Adaptation---多屏幕多分辨率的支持和一些概念