输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个
2013-09-12 00:05
609 查看
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32,321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。
importjava.util.Arrays;
importjava.util.Comparator;
publicclassMinNumFromIntArray{
/**
*Q68输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
*例如输入数组{32,321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。
*/
publicstaticvoidmain(String[]args){
int[][]val={
{32,321},//32132
{532,45,78},//4553278
{2,23,231},//223123
{2,3,1},//123
};
for(int[]x:val){
//solution1
Stringresult=minNumFromIntArray(x);
System.out.println(result);
//solution2
AuxClassminStr=newAuxClass();
minNumFromIntArray2(x,0,x.length-1,minStr);
System.out.println(minStr.str);
}
//System.out.println("32".compareTo("321"));//<0
}
/*solution1:
*ifab<ba,thena<b
*1.sorttheintegerarray.thecomparatoris"ifab<ba,thena<b"
*2.appendeachintegerinthearraytocreateastringandthat'stheresult.
*/
publicstaticStringminNumFromIntArray(int[]x){
String[]strs=stringsOf(x);
Arrays.sort(strs,newComparator<String>(){
publicintcompare(Stringo1,Stringo2){
return(o1+o2).compareTo(o2+o1);
}
});
StringBuildersb=newStringBuilder();
for(Stringeach:strs){
sb.append(each);
}
returnsb.toString();
}
//int[]toString[].Forcomparing.
publicstaticString[]stringsOf(int[]x){
intlen=x.length;
String[]strs=newString[len];
for(inti=0;i<len;i++){
strs[i]=""+x[i];
}
returnstrs;
}
/*solution2
*getallthepermutations.
*findthemin.
*OfcourseweuseStringinsteadofBigInteger.
*/
publicstaticvoidminNumFromIntArray2(int[]x,intfirst,intlast,AuxClassminStr){
if(first==last){
StringBuildersb=newStringBuilder();
for(inteach:x){
sb.append(each);
}
if(minStr.str==null){
minStr.str=sb.toString();
}else{
if(minStr.str.compareTo(sb.toString())>0){
minStr.str=sb.toString();
}
}
return;
}
for(inti=first;i<=last;i++){
swap(x,first,i);
minNumFromIntArray2(x,first+1,last,minStr);
swap(x,first,i);
}
}
publicstaticvoidswap(int[]x,inti,intj){
inttemp=x[i];
x[i]=x[j];
x[j]=temp;
}
/*
*whenyouuse'String'insteadofinnerclass,youget'null'allthetime
*/
staticclassAuxClass{
Stringstr;
}
}
本文转自:http://bylijinnan.iteye.com/blog/1440004
相关文章推荐
- 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个
- 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132
- 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- Comparator 实现集合中元素的比较.输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这321323
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。剑指Offer(32)
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 编程题:输入一个正整数数组,将他们拼接成一个数,输出拼接出所有数字中最小的一个
- 对整数数组里所有的数字拼接起来,输出最小的一个
- 输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 项目39.3-1输入一个正整数,输出它的反序数(反序数,即将其所有位的数字反过来。例如,123是321的反序数)
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 6、 java 输入一个数字组成的数组,输出该数组的最大值和最小值
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3