LeetCode - 179. Largest Number
2016-07-20 17:44
316 查看
这道题目的解答非常聪明而巧妙,我们先来看下面的一个例子:
str1 = "338"
str2 = "9"
s1 = str1 + str2 = "3389"
s2 = str2 + str1 = "9338"
明显9338 > 3389,所以这时我们选择str2在前是明智的。
根据上面的分析,我们可以设计出一个比较大小的规则,使得如果上面的情况发生的话,有str1 < str2,而Java中的Comparator<>接口提供了这种功能,因为Comparator是一个接口,不能对它进行实例化,所以我们可以在题目中给出的Solution类中新建一个内部类stringComp或者使用匿名类来实现这个我们需要的类。
要新建一个类实现Comparator接口的话,需要在类中添加并实现一个方法int compare(T t1, T t2)。在这一步做出之后,剩下的就简单了,只需要调用Arrays.sort()函数并且使用StringBuilder把所有的String连接在一起即可,代码如下:
public class Solution {
class stringComp implements Comparator<String>{
@Override
public int compare(String str1, String str2){
String s1 = str1 + str2;
String s2 = str2 + str1;
return s2.compareTo(s1);
}
}
public String largestNumber(int[] nums) {
if(nums == null || nums.length == 0) return "";
// Convert int to String
String[] numsString = new String[nums.length];
for(int i = 0; i < nums.length; i++){
numsString[i] = String.valueOf(nums[i]);
}
// Sort String based on self-defined rull
Arrays.sort(numsString, new stringComp());
// An extreme corner case by lc, say you have only a bunch of 0 in your int array
if(numsString[0].charAt(0) == '0') return "0";
// Construct answer
StringBuilder sb = new StringBuilder();
for(String s : numsString){
sb.append(s);
}
return sb.toString();
}
}
注意在实现compare函数的时候,我们并不是使用s1.compareTo(s2),而是使用s2.compareTo(s1),因为Arrays.sort是默认从小到大排序的,我们需要的是从大到小,所以使用了这里的一个小技巧。
知识点:
1. 这道题目里的知识点很多了,大部分是关于Java的,最重要的就是自定义比较函数的方法,Arrays.sort(Object[], Comparator<>),Comparator的使用
2. 注意将int转化为String的方法,String.valueOf(int i)就把int变成了相对应的String
str1 = "338"
str2 = "9"
s1 = str1 + str2 = "3389"
s2 = str2 + str1 = "9338"
明显9338 > 3389,所以这时我们选择str2在前是明智的。
根据上面的分析,我们可以设计出一个比较大小的规则,使得如果上面的情况发生的话,有str1 < str2,而Java中的Comparator<>接口提供了这种功能,因为Comparator是一个接口,不能对它进行实例化,所以我们可以在题目中给出的Solution类中新建一个内部类stringComp或者使用匿名类来实现这个我们需要的类。
要新建一个类实现Comparator接口的话,需要在类中添加并实现一个方法int compare(T t1, T t2)。在这一步做出之后,剩下的就简单了,只需要调用Arrays.sort()函数并且使用StringBuilder把所有的String连接在一起即可,代码如下:
public class Solution {
class stringComp implements Comparator<String>{
@Override
public int compare(String str1, String str2){
String s1 = str1 + str2;
String s2 = str2 + str1;
return s2.compareTo(s1);
}
}
public String largestNumber(int[] nums) {
if(nums == null || nums.length == 0) return "";
// Convert int to String
String[] numsString = new String[nums.length];
for(int i = 0; i < nums.length; i++){
numsString[i] = String.valueOf(nums[i]);
}
// Sort String based on self-defined rull
Arrays.sort(numsString, new stringComp());
// An extreme corner case by lc, say you have only a bunch of 0 in your int array
if(numsString[0].charAt(0) == '0') return "0";
// Construct answer
StringBuilder sb = new StringBuilder();
for(String s : numsString){
sb.append(s);
}
return sb.toString();
}
}
注意在实现compare函数的时候,我们并不是使用s1.compareTo(s2),而是使用s2.compareTo(s1),因为Arrays.sort是默认从小到大排序的,我们需要的是从大到小,所以使用了这里的一个小技巧。
知识点:
1. 这道题目里的知识点很多了,大部分是关于Java的,最重要的就是自定义比较函数的方法,Arrays.sort(Object[], Comparator<>),Comparator的使用
2. 注意将int转化为String的方法,String.valueOf(int i)就把int变成了相对应的String
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- 在命令行用 sort 进行排序
- android上改变listView的选中颜色
- String.intern
- Linux Shell - 如何使用sort与uniq命令删除重复的文本行
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- Redis02 使用Redis数据库(String类型)全面解析
- Redis sort 排序命令详解
- 批处理命令教学之字符串排序(sort)
- PostgreSQL ERROR: invalid escape string 解决办法
- mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size的解决方法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C++ 关于STL中sort()对struct排序的方法
- C#中string和StingBuilder内存中的区别实例分析
- 详解C++中实现继承string类的MyString类的步骤