lintcode:组成最大的数
2016-04-30 12:56
471 查看
最大数
给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例
给出
解题
本质上是一种排序,但是排序规则如何定义?
对于20 23 可以组成2023 和2320 显然2320更大应该排在前面
对于5 51 可以组成551 和 515 显然551更大应该排在前面
所以在比较两个数大小的规则应该将两个数链接起来后再比较大小
对于left、right
我们应该比较:leftright 和rightleft 的大小
通过字符串比较如下
修改快排的规则
给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例
给出
[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; } }
相关文章推荐
- 同一个C语言工程不同C文件之间的函数互相调用问题(二)
- Program3_B
- 基于Boost方法的人脸检测(3):特征生成、特征值计算(积分图)
- android学习记录 Onclick事件监听
- Hanoi双塔问题(hanoi)
- 对C++中mutable、inline、volatile关键字的理解
- Leetcode - Best Time to Buy and Sell Stock
- 基于Boost方法的人脸检测(2):样本生成(切割图像、resize图像、灰度化图像、保存图片)
- POJ 2135 Farm Tour (最小费用最大流)
- 【模板】Lucas定理
- 搭建Windows Embedded Compact 7开发环境
- 纪念品分组(贪心)
- CONFIG_OF
- 使用map关联容器
- 基于Boost方法的人脸检测(1):整体思路
- 修改ToolBar的旋转图标的颜色
- java随机生成字符串
- 树网的核(floyd,树直径)
- 同一个C语言工程不同C文件之间的函数互相调用问题(一)
- 【模板】图的割点