最大数

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

注意事项

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

样例

给出 [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;
}
}

lintcode:组成最大的数的更多相关文章

  1. lintcode 落单的数(位操作)

    题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...

  2. LintCode之回文数

    题目描述: 我的代码: public class Solution { /* * @param num: a positive number * @return: true if it's a pal ...

  3. [LintCode] Two Sum 两数之和

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  4. [LintCode] Happy Number 快乐数

    Write an algorithm to determine if a number is happy. A happy number is a number defined by the foll ...

  5. [LintCode] Ugly Number 丑陋数

    Write a program to check whether a given number is an ugly number`. Ugly numbers are positive number ...

  6. [LintCode] 寻找缺失的数

    class Solution { public: /** * @param nums: a vector of integers * @return: an integer */ int findMi ...

  7. [Lintcode two-sum]两数之和(python,双指针)

    题目链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 给一个整数数组,找到两个数使得他们的和等于一个给定的数target. 备份一份,然后排序.搞两个 ...

  8. [LintCode/LeetCode]——两数和、三数和、四数和

    LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号: ...

  9. Lintcode 82.落单的数

    -------------------------------- 这道题好坑啊,自己说是2*n+1个数字,结果有组测试数据竟然传了个空数组进来... 经典位算法: n^n==0 n^0==n AC代码 ...

随机推荐

  1. Qt---在QLabel上实现系统时间

    参考:http://blog.csdn.net/g457499940/article/details/11923887 ---------------------------------------- ...

  2. 技术揭秘12306改造(一):尖峰日PV值297亿下可每秒出票1032张

    [编者按]12306网站曾被认为是"全球最忙碌的网站",在应对高并发访问处理方面,曾备受网民诟病. 2015年铁路客票春运购票高峰期已过,并且12306网站今年没"瘫痪& ...

  3. Cocos2dx中利用双向链表实现无限循环滚动层

    [Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚 ...

  4. 我给女朋友讲编程html系列(3) --html中的超链接标签-a标签 和 框架frame与框架集frameset

    我们浏览网页的时候,当单击某段文字或图片时,就会打开一个新的网页,这里面就使用了超链接. 就比如下图是一个导航类网页,当你单击某个链接就会打开新的网页. 比如,我拿我的qq空间“金河访谈”举例,新建一 ...

  5. Netsharp FAQ

    1.启动服务器时候不能监听端口,出现如下错误: 回答: 这种问题应该是在win7环境下才有,是没有权限,要以管理员身份运行Netsharp.Elephant.Q.exe. 2.启动服务器的时候,服务端 ...

  6. WooCommerce微信支付插件免费版下载

    WooCommerce微信支付插件免费版下载 2016-05-11 点击:605 免费版来了 免费版终于来了,直接下载用吧,当然免费少一些功能,只有PC扫码支付,没有微信原生支付,没有汇率,没有退款, ...

  7. POJ2676-Sudoku(数独)

    想了好久没想到好的解决办法,参考了 http://user.qzone.qq.com/289065406/blog/1303713313 大致题意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格 ...

  8. httpclient模拟浏览器get\post

    一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等.所访问的这些页面有的仅 仅是一些普通的页面,有的需要用户登录后方可使用,或者需 ...

  9. boost之signal

    boost里的signal是一个模板类,不区分信号种类,产生信号统一用()调用操作符. 1.回调普通函数代码示例: #include <iostream> #include <str ...

  10. matrix_world_final_2013

    A http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98960#problem/A 题意:给一个正方形,四边上有A-Z带+-,如果是00就不 ...