lintcode:组成最大的数
2024-10-19 18:36:03
给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例
给出 [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;
}
}
最新文章
- 豪情-CSS解构系列之-新浪页面解构-02
- 领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net
- Redis 常用操作
- PHP的CURL
- notepad++快捷键
- POJ 2389	Bull Math(水~Java -大数相乘)
- Android APP高效开发的十大建议
- Linux shell用法和技巧(转)
- Java发送邮件(带附件)
- chrome调试工具常用功能整理(转)
- Django_xadmin_应用外键搜索功能错误
- jenkins 构建nodejs-pipeline流水风格的任务
- .NET Core开发日志——Peachpie
- Docker 入门(Mac环境)- part 3 服务(services)
- 列表生成式&;生成器表达式
- 【Unity笔记】UGUI物体的渲染顺序
- SPOJ - PGCD Primes in GCD Table(莫比乌斯反演)
- 使用CXF+Spring发布WebService,启动报错
- LA 3720 高速公路(互质判斜率)
- linux下不错的小软件