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.

思路:

忧伤的发现,人的思路真的是很容易定型。这道题我做过的,但是过了这么久,我还是只记得我自己的老思路。

直接上正确答案, 关键是排序时比较的策略, 用s1+s2 和 s2+s1 比较即可,就是把两种方式排列的情况都试一下,看哪个大!!

class Compare{
public:
bool operator()(string s1, string s2)
{
return s1 + s2 < s2 + s1;
}
}; class Solution {
public:
string largestNumber(vector<int> &num) {
int i;
for (i = ; i < num.size(); i++)
if (num[i] != )
break;
if (i == num.size()) // All numbers are 0
return "";
vector<string> v;
for (i = ; i < num.size(); i++)
v.push_back(to_string(num[i]));
sort(v.begin(), v.end(), Compare());
string result;
for (i = v.size() - ; i >= ; i--)
result += v[i];
return result;
}
};

我自己的思路:

两个数比较 如 724 和7247 那么比较 724|724 与 7247|7247 即相同时就不断复制自己,直到遇到不同的数字得到大小。 如果两个数字同时达到末尾,但是数字一直相同,则这两个数字相同。

代码很长,但是也AC了,慢一些。主要是二分归并排序是我自己写的。

class Solution {
public:
string largestNumber(vector<int> &num) { MergeSort(num, , num.size() - );
string ans;
for(int i = ; i < num.size(); i++)
{
stringstream ss;
ss << num[i];
string s = ss.str();
ans.append(s);
}
if(!ans.empty() && ans[] == '')
{
ans = "";
}
return ans;
} bool islarge(int aa, int bb)
{
stringstream ss;
ss << aa;
string sa = ss.str();
ss << bb;
string sb = ss.str(); int i = , j = ;
while(sa[i % sa.length()] == sb[j % sb.length()]
&& !((i + ) % sa.length() == && (j + ) % sb.length() == )) //两边同时结束时跳出,防止相同数字无限循环
{
i++; j++;
} return sa[i % sa.length()] > sb[j % sb.length()];
} void MergeSort(vector<int> &in, int l, int r)
{
if(l < r)
{
int mid = (l + r) / ;
MergeSort(in, l, mid);
MergeSort(in, mid + , r);
Merge(in, l, mid, r);
}
}
void Merge(vector<int> &in, int l, int mid, int r)
{
vector<int> left(in.begin() + l, in.begin() + mid + ), right(in.begin() + mid + , in.begin() + r + );
int i = , j = , k = ;
while(i < left.size() && j < right.size())
{
if(islarge(left[i], right[j]))
{
in[l + k] = left[i++];
}
else
{
in[l + k] = right[j++];
}
k++;
}
while(i < left.size())
{
in[l + k] = left[i++];
k++;
}
while(j < right.size())
{
in[l + k] = right[j++];
k++;
}
}
};

【leetcode】Largest Number ★的更多相关文章

  1. 【LeetCode】Largest Number 解题报告

    [LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...

  2. 【leetcode】Largest Number

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

  3. 【LeetCode】792. Number of Matching Subsequences 解题报告(Python)

    [LeetCode]792. Number of Matching Subsequences 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...

  4. 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)

    [LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...

  5. 【LeetCode】Single Number I & II & III

    Single Number I : Given an array of integers, every element appears twice except for one. Find that ...

  6. 【LeetCode】476. Number Complement (java实现)

    原题链接 https://leetcode.com/problems/number-complement/ 原题 Given a positive integer, output its comple ...

  7. 【leetcode】Largest Plus Sign

    题目如下: In a 2D grid from (0, 0) to (N-1, N-1), every cell contains a 1, except those cells in the giv ...

  8. 【LeetCode】191. Number of 1 Bits 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 右移32次 计算末尾的1的个数 转成二进制统计1的个 ...

  9. 【LeetCode】1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 代码 复杂度分析 日期 题目地址:http ...

随机推荐

  1. sqoop

    http://blog.csdn.net/yfkiss/article/details/8700480 http://www.cnblogs.com/admln/p/sqoop1-99-4-javaa ...

  2. spark

    http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool spark presto2.0计算引擎 http://blog ...

  3. Perl 正则表达式

    匹配:m/<regexp>;/ (还可以简写为 /<regexp>;/ ,略去 m)替换:s/<pattern>;/<replacement>;/转化: ...

  4. POJ 2299 Ultra-QuickSort

    离散化+树状数组求逆序数 Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 35024 Accept ...

  5. maven之ubutu安装

    1.下载地址:http://maven.apache.org/download.cgi 2.安装 将下载后的文件解压到你指定的文件即可,命令如下: tar -xzvf apache-maven-3.0 ...

  6. 从程序员到CTO的Java技术路线图

    转自:http://zz563143188.iteye.com/blog/1877266 企业级项目实战地址:http://zz563143188.iteye.com/blog/1825168 开发资 ...

  7. C++Socket编程总结 [转]

    使用socket写代码主要是要看自己的需求是什么. 如果通信时,内容很重要就要使TCP方式. 如果用户数太多,可能就要使用UDP方式了. 在TCP模式下,最简单的方式就是这样的,使阻塞方式: 服务端: ...

  8. 转载自安卓巴士 【收藏】2015必须推荐的Android框架,猿必读系列!

    一.Guava Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries ...

  9. 淘宝(阿里百川)手机客户端开发日记第十一篇 JSP+Servlet

    由于本人从事.net开发已有多年经验,今天由于工作需要,我只能学习下JSP+Servlet,至于java web提供了更好的开发框架MVC,现在由于时间关系,我只好用JSP+Servlet来搭建服务器 ...

  10. HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...