LeetCode: Largest Number 解题报告 以及Comparator, CompareTo 应用
Largest Number
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note: The result may be very large, so you need to return a string instead of an integer.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
SOLUTION 1:
参考http://bookshadow.com/weblog/2015/01/13/leetcode-largest-number/的解法:
贪心思路:对于两个备选数字a和b,如果str(a) + str(b) > str(b) + str(a),则a在b之前,否则b在a之前
按照此原则对原数组从大到小排序即可
时间复杂度O(nlogn)
易错样例:
Input: [0,0]
Output: "00"
Expected: "0"
JAVA CODE:
public class Solution {
public String largestNumber(int[] num) {
// 1045
// 1111 begin.
if (num == null) {
return null;
}
ArrayList<Integer> list = new ArrayList<Integer>();
for (int n1: num) {
list.add(n1);
}
Collections.sort(list, new Comparator<Integer>(){
public int compare(Integer o1, Integer o2) {
String s1 = "" + o1 + o2;
String s2 = "" + o2 + o1;
return s2.compareTo(s1);
}
});
StringBuilder sb = new StringBuilder();
for (int n: list) {
sb.append(n);
}
if (sb.charAt() == '') {
return "";
}
return sb.toString();
}
}
附上一些关于Comparator ,comparable 的解释:
Comparator 是一个独立的比较器,里面implements "compare",而Comparable 可以由class本身来implement。
http://stackoverflow.com/questions/4108604/java-comparable-vs-comparator
Java : Comparable vs Comparator [duplicate]
When your class implements Comparable, the compareTo method of the class is defining the "natural" ordering of that object. That method is contractually obligated (though not demanded) to be in line with other methods on that object, such as a 0 should always be returned for objects when the .equals() comparisons return true.
A Comparator is its own definition of how to compare two objects, and can be used to compare objects in a way that might not align with the natural ordering.
For example, Strings are generally compared alphabetically. Thus the "a".compareTo("b") would use alphabetical comparisons. If you wanted to compare Strings on length, you would need to write a custom comparator.
In short, there isn't much difference. They are both ends to similar means. In general implement comparable for natural order, (natural order definition is obviously open to interpretation), and write a comparator for other sorting or comparison needs.
相关reference:
http://examples.javacodegeeks.com/core-java/util/comparator/java-comparator-example/
CompareTo示例:
以下的小例子展示了CompareTo的用法:
Card 这个class 使用compareTo函数来实现内建的排序规则,输出如下:
false
1
2
4
public static void main(String[] strs) {
int[] num = {, };
largestNumber(num);
ArrayList<Card> cards = new ArrayList<Card>();
Card card1 = new Card();
Card card2 = new Card();
Card card3 = new Card();
cards.add(card1);
cards.add(card2);
cards.add(card3);
if (card1.compareTo(card2) > ) {
System.out.println("true");
} else {
System.out.println("false");
}
// uses compareTo method implemented in Card object to compare them
Collections.sort(cards);
// uses compare method implements in Comparator class
//Collections.sort(cards, new CompareBySuitRank());
for (Card card : cards)
System.out.println(card.toString());
}
public static class Card implements Comparable<Card>{
int val;
public String toString() {
return "" + val;
}
public Card(int val) {
super();
this.val = val;
}
public int compareTo(Card o) {
return this.val - o.val;
}
}
Github:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/string/LargestNumber.java
LeetCode: Largest Number 解题报告 以及Comparator, CompareTo 应用的更多相关文章
- 【LeetCode】Largest Number 解题报告
[LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...
- 【LeetCode #179】Largest Number 解题报告
原题链接:Largest Number 题目描述: Given a list of non negative integers, arrange them such that they form th ...
- 【原创】leetCodeOj --- Largest Number 解题报告
原题地址: https://oj.leetcode.com/problems/largest-number/ 题目内容: Given a list of non negative integers, ...
- LeetCode: Valid Number 解题报告
Valid NumberValidate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- LeetCode: Combination Sum 解题报告
Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...
- 【九度OJ】题目1040:Prime Number 解题报告
[九度OJ]题目1040:Prime Number 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1040 题目描述: Ou ...
- [LeetCode] 179. Largest Number 解题思路
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- [LeetCode] Largest Number 最大组合数
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
随机推荐
- C++语言实现-拓扑排序
1.拓扑排序的概念 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则 ...
- 洛谷 P1141【BFS】+记忆化搜索+染色
题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...
- 51Nod-1006【LCS】+【输出路径】模板题
题目链接:https://vjudge.net/contest/225715#problem/B 转载于>>> 题目大意: 给出两个序列,要求输出它们的最长公共子序列. 解题思路: ...
- 从字符集发展史看Unicode和UTF-8的区别
从字符集发展史看Unicode和UTF-8的区别 版权声明 本文并非本人原创,其内容来源于网络,本文根据其演绎而来,具体出出已经无法考证,在这里只好给出我所参考的连接. 知乎 https://www. ...
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)
类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...
- [POI2018]Pionek
[POI2018]Pionek 题目大意: 在无限大的二维平面的原点放置着一个棋子.你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示.请你选取若干条 ...
- STL之heap与优先级队列Priority Queue详解
一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的m ...
- java运行时could not open ........jvm.cfg问题的解决
我相信这个问题肯定让不少人头疼.小编也纠结了将近3个小时的时间,终于弄明白这是怎么回事并且解决 java都知道时运行命令,不能打开...jvm.cfg很明显是jre虚拟机出现了问题(要么时jre的路径 ...
- 简单的三道shell例题
problem: 1. 输入一个ip列表文件,文件每行为以tab键分隔的两列,分别为一个ip段的起始ip和结束ip,ip均为点分形式.要求将该文件中各ip段包含的每一个有效ip以非点分形式输出到一个文 ...