最大数

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

注意事项

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

样例

给出 [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. JavaScript构建(编绎)系统大比拼:Grunt vs. Gulp vs. NPM

    Nicolas Bevacqua进行了一个比较JavaScript构建(编绎)系统的任务.他对三巨头: Grunt, Gulp and NPM进行了比较,并讨论了每种的优缺点. By Nicolas ...

  2. 套接字I/O模型之WSAEventSelect

    今天我又学习了一种新的套接字I/O模型------WSAEventSelect,他与WSAAsyncSelect一样也是一种异步事件通知模型,不同的是WSAAsyncSelect是与窗口句柄关联在一起 ...

  3. java笔试题(4)

    abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? abstract的method 不可以是static的,因为抽象的方法是要被子 ...

  4. Careercup - Google面试题 - 5162732873580544

    2014-05-08 08:26 题目链接 原题: Given a preorder traversal, create a binary search tree in optimized time ...

  5. Hibernate内存溢出分析一例

    公司业务系统在进行压力测试时,压测24小时后系统发生内存溢出.经过分析读dump文件,发现org.hibernate.stat.StatisticsImpl类的hashmap类型的变量存储了大量数据( ...

  6. js分页

    今天看了下妙味课堂的教程,写了下关于分页的js代码,写完的感觉就是有点小麻烦,需要很多if判断,思路要清晰 点击预览:http://peng666.github.io/blogs/page <! ...

  7. Django:快速搭建简单的Blog

    一,创建项目 1, 为blog创建名为mysite的工程项目: django-admin.py startproject mysite 2, 项目结构如下: mysite ├── manage.py ...

  8. Java 死锁诊断 -- 线程转储

    java线程转储 java的线程转储可以被定义为JVM中在某一个给定的时刻运行的所有线程的快照.一个线程转储可能包含一个单独的线程或者多个线程.在多线程环境中,比如J2EE应用服务器,将会有许多线程和 ...

  9. MyEclipse 关闭拼写检查、JavaScript的检查Build、xml、JSP的Bulid检查

    前言 MyEclipse 的拼写检查.JavaScript的检查Build.xml.JSP的Bulid检查很讨厌,有时不仅会一直build卡住,而且明明是对的它却报错,示例: 关闭方法 1.关闭拼写检 ...

  10. Linux sort --copy

    Source: http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html sort是在Linux里非常常用的一个命令,管排序的,集中 ...