最大数

给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。

注意事项

最后的结果可能很大,所以我们返回一个字符串来代替这个整数。

样例

给出 [1, 20, 23, 4, 8],返回组合最大的整数应为8423201

解题

本质上是一种排序,但是排序规则如何定义?

对于20 23 可以组成2023 和2320 显然2320更大应该排在前面

对于5 51 可以组成551 和 515 显然551更大应该排在前面

所以在比较两个数大小的规则应该将两个数链接起来后再比较大小

对于left、right

我们应该比较:leftright 和rightleft 的大小

通过字符串比较如下

public class Solution {
/**
*@param num: A list of non negative integers
*@return: A string
*/
public String largestNumber(int[] num) {
// write your code here
ArrayList<String> list = new ArrayList<String>();
for(int i:num)
list.add(i+"");
Collections.sort(list,new Comparator<String>(){
public int compare(String left,String right){
String leftright = left + right;
String rightleft = right + left;
return leftright.compareTo(rightleft);
}
});
String result="";
for(int i =list.size()-1;i>=0;i--)
result+= list.get(i);
// if(result.equals("00") ||result.equals("0000")||result.equals("00000"))
// return "0";
// 去除左边无效的 0
int i = 0;
while(i< result.length() && result.charAt(i) =='0')
i++;
if(i==result.length())
return "0";
return result.substring(i);
}
}

修改快排的规则

public class Solution {
/**
*@param num: A list of non negative integers
*@return: A string
*/
public String largestNumber(int[] num) {
// write your code here
String result = "";
quickSort(num,0,num.length - 1);
for(int i = 0;i<num.length;i++)
result += num[i];
// 去除左边无效的 0
int i = 0;
while(i< result.length() && result.charAt(i) =='0')
i++;
if(i==result.length())
return "0";
return result.substring(i);
}
// 可以理解为逆序排序,排序后直接链接起来就是答案
public void quickSort(int[] num,int low,int high){
if(low>high)
return;
// for(int kk:num)
// System.out.print(kk+" ");
// System.out.println();
int i= low;
int j= high;
int x = num[i];
while(i<j){
while(i<j && compare(x,num[j]))
j--;
if(i<j){
num[i] = num[j];
i++;
}
while(i<j && compare(num[i],x))
i++;
if(i<j){
num[j] = num[i];
j--;
}
}
num[i] = x;
quickSort(num,low,i-1);
quickSort(num,i+1,high);
}
// AB > BA 说明A应该在前面,B应该在后面
public boolean compare(int A,int B){
String left = A+"";
String right =B+"";
String leftright = left + right;
String rightleft = right + left;
return leftright.compareTo(rightleft) >0;
}
}

最新文章

  1. 豪情-CSS解构系列之-新浪页面解构-02
  2. 领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net
  3. Redis 常用操作
  4. PHP的CURL
  5. notepad++快捷键
  6. POJ 2389 Bull Math(水~Java -大数相乘)
  7. Android APP高效开发的十大建议
  8. Linux shell用法和技巧(转)
  9. Java发送邮件(带附件)
  10. chrome调试工具常用功能整理(转)
  11. Django_xadmin_应用外键搜索功能错误
  12. jenkins 构建nodejs-pipeline流水风格的任务
  13. .NET Core开发日志——Peachpie
  14. Docker 入门(Mac环境)- part 3 服务(services)
  15. 列表生成式&amp;生成器表达式
  16. 【Unity笔记】UGUI物体的渲染顺序
  17. SPOJ - PGCD Primes in GCD Table(莫比乌斯反演)
  18. 使用CXF+Spring发布WebService,启动报错
  19. LA 3720 高速公路(互质判斜率)
  20. linux下不错的小软件

热门文章

  1. Xcode7免证书真机调试实践
  2. java数据结构和算法------堆排序
  3. Qt---在QLabel上实现系统时间
  4. JS全局屏蔽回车事件
  5. 有关ZxMiddleTier构想
  6. java中直接打印对象
  7. Leetcode Variant-Plus N
  8. 在mac下使用brew和brew cask轻松实现软件安装
  9. js+CSS实现模拟华丽的select控件下拉菜单效果
  10. 设计模式之适配器模式(Adapter)