179. Largest Number

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.

由题意可以知道,结果最大数字符串是由这些数字转成字符串后按其降序排列而来。理解这一点这道题就简单了。

另外需要考虑一些特殊情况:如全是0的情况、为空的情况等等。

class Solution {
public:
string largestNumber(vector<int>& nums) {
string result;
vector<string> arr;
for (const auto n:nums)
{
arr.push_back(to_string(n));
} sort(arr.begin(), arr.end(), [](const string& s1, const string& s2){return s1 + s2 > s2 + s1; });
for (const auto& e:arr)
{
result += e;
} if (result.at(0) == '0')
{
return "0";
} return result;
}
};

上面代码是先将int窗口转成相应string的容器,然后对string容器中string进行降序排序,最后排序后的string拼接成一个字符串,再排除特殊情况即可。

下面给出的方法从代码角度来看更简洁,但性能方面会差一点,因在排序过程,每两个int转成字符串比较过程中,每次to_string都会构造一个string, 然后两个string再进行+运算符, 最后两个string再进行>运算符,额外开销有点大。

class Solution
{
public:
string largestNumber(vector<int>& nums)
{
string result; if (nums.empty())
{
return "0";
} sort(nums.begin(), nums.end(),
[](const int n1, const int n2){return to_string(n1) + to_string(n2) > to_string(n2) + to_string(n1); }); for (const auto e:nums)
{
result += to_string(e);
} if (result.at(0) == '0')
{
return "0";
} return result;
}
};

上面两种方法在leetcode上模拟运行,方法1运行大概8ms, 方法2大概28ms, 主要性能消耗还是在排序过程中对int数据按字符串比较排序,不断地string隐式构造及string运算符+及>的重载。其实这里我们可以将及单独实现,优化掉这块的消耗。

class Solution
{
static bool intAsstrCompare(int a, int b)
{
char aBuf[64];
char bBuf[64]; memset(aBuf, 0, sizeof(aBuf));
memset(bBuf, 0, sizeof(bBuf)); sprintf(aBuf, "%d%d", a, b);
sprintf(bBuf, "%d%d", b, a); return strcmp(aBuf, bBuf) > 0;
} public:
string largestNumber(vector<int>& nums)
{
string result; if (nums.empty())
{
return "0";
} sort(nums.begin(), nums.end(), intAsstrCompare); for (const auto e:nums)
{
result += to_string(e);
} if (result.at(0) == '0')
{
return "0";
} return result;
}
};

上面代码运行后为12ms, 竟然还没有方法1快!!!有兴趣的可以接着去研究一下。

最新文章

  1. 选择列表控件的使用(PickList)
  2. 输入n行整数,每行的个数不确定,整数之间用逗号分隔
  3. Json.Net使用JSON Schema验证JSON格式
  4. java日志框架与日志系统
  5. JXL读取Excel日期时间不准确
  6. 执行*.sh脚本时提示Permission denied
  7. OPENCV第一篇
  8. 各种文件的ContentType
  9. 编译uboot提示libasm-offsets.c10 error bad value (armv5)解决方法
  10. 使用webpack打包css和js
  11. jquery和js检测浏览器窗口尺寸和分辨率
  12. 恭喜&quot;微微软&quot;喜当爹,Github嫁入豪门。
  13. POJ2421 Constructing Roads【最小生成树】
  14. 20172302 《Java软件结构与数据结构》第五周学习总结
  15. Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
  16. winform窗体启动过程
  17. PHP 取302跳转后真实 URL 的两种方法
  18. Lintcode449-Char to Integer-Naive
  19. M100(3) 无线数传
  20. [uart]1.Linux中tty框架与uart框架之间的调用关系剖析

热门文章

  1. Lua 调用 Opencv 的方法
  2. linux下一些可用库
  3. bash shell,调用ffmpeg定期截图
  4. h5的拖放(drag和drop)
  5. CocoaPods使用详细说明
  6. Delphi写的DLL回调C#
  7. nginx下rewrite参数超过9个的解决方法
  8. 【总结】总结写了3个React页面后遇到的各种坑
  9. mysql删造成表死锁研究
  10. html中空格转义字符