lintcode:组成最大的数
给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
注意事项
最后的结果可能很大,所以我们返回一个字符串来代替这个整数。
样例
给出 [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:组成最大的数的更多相关文章
- lintcode 落单的数(位操作)
题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...
- LintCode之回文数
题目描述: 我的代码: public class Solution { /* * @param num: a positive number * @return: true if it's a pal ...
- [LintCode] Two Sum 两数之和
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- [LintCode] Happy Number 快乐数
Write an algorithm to determine if a number is happy. A happy number is a number defined by the foll ...
- [LintCode] Ugly Number 丑陋数
Write a program to check whether a given number is an ugly number`. Ugly numbers are positive number ...
- [LintCode] 寻找缺失的数
class Solution { public: /** * @param nums: a vector of integers * @return: an integer */ int findMi ...
- [Lintcode two-sum]两数之和(python,双指针)
题目链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 给一个整数数组,找到两个数使得他们的和等于一个给定的数target. 备份一份,然后排序.搞两个 ...
- [LintCode/LeetCode]——两数和、三数和、四数和
LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号: ...
- Lintcode 82.落单的数
-------------------------------- 这道题好坑啊,自己说是2*n+1个数字,结果有组测试数据竟然传了个空数组进来... 经典位算法: n^n==0 n^0==n AC代码 ...
随机推荐
- EF - 批量插入
比较一下下面两种方式的区别 1,每Add一次 就savechange() static void Main(string[] args) { //List<User> users= Fin ...
- Android实现入门界面布局
Android实现入门界面布局 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 首先是常量的定义,安卓中固定字符串应该定义在常量中. stri ...
- iOS 进阶 第十九天(0423)
0427 深复制/浅复制 浅复制:是址引用 深复制:是值拷贝 下面是解释,如下图: 运行时机制runtime 1.表象的就是MPMoviePlayer 2.深层的是 clang -rewrite-ob ...
- iOS9新系统下APP Store 应用上传新指南
一 iTunes Connect介绍 iTunes Connect是面向iOS应用开发人员的苹果门户网站,供开发人员管理其应用,跟踪下载情况.今年1月份闹得沸沸扬扬的iTunes Connect BU ...
- 格式化输出[part1/标准控制符]
/* 设置输出字符的宽度 width(int)是iostream类的成员函数,可以通过cout对象来调用,即cout.width(int) 注: 1.width(int)只影响将要显示的一个对象,之后 ...
- js之基本包装类型
为了便于操作“基本类型值”,JS 提供了 三个 特殊的引用类型:Boolean.Number.String.这些类型和其他引用类型相似,但同时 也具备 与各自基本类型相应的特殊行为. 实际上:每当读取 ...
- QTP与Selenium的比较
1.用户仿真:Selenium在浏览器后台执行,它通过修改HTML的DOM(文档对象模型)来执行操作,实际上是通过javascript来控制的.执行时窗口可以最小化,可以在同一机器执行多个测试.QTP ...
- Eclipse Kepler中配置JadClipse
Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java,javac命令是一样的.不过因为是控制台运行,所以用起来不太方便.不过幸好有一个eclipse的插件JadClipse ...
- Oracle 用户权限分配说明
一般来说,Oracle普通用户创建后,不建议分配DBA权限.那么一般分配哪些权限呢? 首先来说,一个Oracle普通用户,我们一般性的要求是: 1.能够在本用户下进行本用户相关的创建表结构,数据维 ...
- C++中static的全部作用
要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short ...