剑指offer刷题之java实现的把数组排成最小的数
2015-09-04 20:39
387 查看
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。参考文献:把数组排成最小的数以及Java中的Comparable接口
comparator接口与Comparable接口的区别
import java.util.Arrays; import java.util.Comparator; public class PrintMinNumberSolution { //方法一:用comparable接口实现 public String PrintMinNumber(int [] numbers) { String res = ""; if(numbers==null || numbers.length == 0){ return res; } MString m[] = new MString[numbers.length]; String st[] = Int2String(numbers); int k=0; for(String i:st){ m[k] = new MString();//!必须先赋值才能对它的成员变量进行访问 m[k++].s = i; } Arrays.sort(m); for (int i = 0; i < m.length; i++) { res+=m[i].s; } return res; } //方法一 :必须要对进行比较的类T内部进行改造。首先实现接口 Comparable<T>,(必须是T因为后面比较内部都是对对象进行的,否则出现类型转换错误) //然后重写方法 compare(T t)即可。然后Arrays.sort(T[])自动回调用这个比较器 class MString implements Comparable<MString>{ public String s ; @Override public int compareTo(MString o) { // TODO Auto-generated method stub String s1 = s+o.s; String s2 = o.s+s; if(s1.compareTo(s2) > 0){ return 1; }else if(s1.compareTo(s2) <0) return -1; else return 0; } public String toString() { return s;//"MString [s=" + s + "]"; } } public String[] Int2String(int [] a){ String b[] = new String[a.length]; for(int i=0;i<a.length;i++){ b[i] = String.valueOf(a[i]); } // System.out.println(Arrays.toString(b)); return b; } //方法二:用comparator接口实现 public String PrintMinNumber1(int [] numbers) { String res = ""; if(numbers==null || numbers.length == 0){ return res; } MString1 m[] = new MString1[numbers.length]; String st[] = Int2String(numbers); int k=0; for(String i:st){ m[k] = new MString1(); m[k++].s = i; } MString1Comparator m1c = new MString1Comparator(); Arrays.sort(m,m1c); for (int i = 0; i < m.length; i++) { res+=m[i].s; } return res; } class MString1{ public String s; } //方法二:无需修改要比较的类T。只需要写一个新的比较器类x,实现Comparator<T>接口,重写compareTo(T t1,T t2)方法。 //然后Arrays.sort(T[],x)自动会对这个T[]数组采用x比较器方法,调用这个比较器。可实现复用。以后更改比较器方法方便了。 class MString1Comparator implements Comparator<MString1>{ @Override public int compare(MString1 o1, MString1 o2) { String s1 = o1.s+o2.s; String s2 = o2.s+o1.s; if(s1.compareTo(s2) > 0){ return 1; }else if(s1.compareTo(s2) <0) return -1; else return 0; } } public static void main(String[] args) { PrintMinNumberSolution pms = new PrintMinNumberSolution(); int a[] = new int []{3,32,321}; System.out.println("测试方法一:用comparable接口实现"); System.out.println(pms.PrintMinNumber(a)); System.out.println("测试方法二:用comparator接口实现"); System.out.println(pms.PrintMinNumber1(a)); //测试数组两层new的区别。这也是为什么测试数组为空要两次,一个测引用为不为null,二个测具体的数组值为不为空 MString1[] mm; mm = new MString1[4]; // mm[0] = new MString1(); int[] aa = new int[4]; aa[0] = 3; String [] bb = new String[4]; bb[0] = "sg"; System.out.println(mm[0]+" "+aa[0]+" "+bb[0]); } }
相关文章推荐
- 最简明的JavaScript闭包解释
- Can't open framebuffer device /dev/fb0 ------[TQ2440-QT-first]
- jQuery操作Select
- 剑指offer之把数组排成最小的数
- 剑指offer 二进制中1的个数
- Windows7 x64系统下安装Nodejs并在WebStorm 9.0.1下搭建编译less环境
- Jquery ui Interactions方法的使用实例
- 剑指offer:数值的整数次方 代码实现
- 前端性能优化指南
- html在不同浏览器里面实现背景音乐的播放
- 剑指offer:旋转数组的最小数字 代码实现
- LeetCode -- Count Complete Tree Node
- jsp内置九大对象
- 用js实现透明度渐变效果
- CSS实现表格无外边框效果(只有内十字)
- CDH5.4.5运行Phoenix导入CSV文件
- JQuery中用Ajax的POST方式与WCF交互
- 剑指offer:重建二叉树
- 关于“吴亦凡入伍”H5的背后的技术(前端篇)
- jQuery 选项卡插件 FengTab by FungLeo