`

java-68-把数组排成最小的数。一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的。例如输入数组{32, 321},则输出32132

 
阅读更多
import java.util.Arrays;
import java.util.Comparator;

public class MinNumFromIntArray {

	/**
	 * Q68输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
	 * 例如输入数组{32,  321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。
	 */
	public static void main(String[] args) {
		int[][] val={
				{32,321},//32132
				{532,45,78},//4553278
				{2,23,231},//223123
				{2,3,1},//123
		};
		for(int[] x:val){
			//solution 1
			String result=minNumFromIntArray(x);
			System.out.println(result);
			//solution 2
			AuxClass minStr=new AuxClass();
			minNumFromIntArray2(x,0,x.length-1,minStr);
			System.out.println(minStr.str);
		}
		
		//System.out.println("32".compareTo("321"));//<0
	}
	
	/*solution 1: 
	 * if ab<ba,then a<b
	 * 1.sort the integer array. the comparator is "if ab<ba,then a<b"
	 * 2.append each integer in the array to create a string and that's the result.
	 */
	public static String minNumFromIntArray(int[] x){
		String[] strs=stringsOf(x);
		Arrays.sort(strs,new Comparator<String>(){
			public int compare(String o1, String o2) {
				return (o1+o2).compareTo(o2+o1);
			}
		});
		StringBuilder sb=new StringBuilder();
		for(String each:strs){
			sb.append(each);
		}
		return sb.toString();
	}
	
	//int[] to String[].For comparing.	
	public static String[] stringsOf(int[] x){
		int len=x.length;
		String[] strs=new String[len];
		for(int i=0;i<len;i++){
			strs[i]=""+x[i];
		}
		return strs;
	}
	
	/*solution 2
	 * get all the permutations.
	 * find the min.
	 * Of course we use String instead of Big Integer.
	 */
	public static void minNumFromIntArray2(int[] x,int first,int last,AuxClass minStr){
		if(first==last){
			StringBuilder sb=new StringBuilder();
			for(int each: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(int i=first;i<=last;i++){
			swap(x,first,i);
			minNumFromIntArray2(x,first+1,last,minStr);
			swap(x,first,i);
		}
	}
	public static void swap(int[] x,int i,int j){
		int temp=x[i];
		x[i]=x[j];
		x[j]=temp;
	}
	
	/*
	 * when you use 'String' instead of inner class,you get 'null' all the time
	 */
	static class AuxClass{
		String str;
	}
}

0
0
分享到:
评论

相关推荐

    设有n个正整数,将他们连接成一排,组成一个最大的多位整数

    本题属于数组排序类问题,目的是寻找一种方法,能够将一系列正整数进行排列,使得它们按照特定顺序拼接后形成的数字最大。 **核心问题:** - 如何确定两个数字的先后顺序,使得拼接后的数字最大? - 对于多个数字,...

    2021字节跳动面试参考手册.pdf

    9. 把数组排成最小数。 - 通过将数组中的元素进行排序,组合成一个最小的数值。 10. 丑数。 - 丑数是指只包含质因数2、3、5的正整数,通常需要动态规划或暴力法解决。 11. 数组中只出现一次的数字。 - 使用异或...

    java经典编程题

    15.输入数组,最大的与第一个交换,最小的数与最后一个数交换,输出数组; 16.输入n个数,使其前m个数向后移动m个位置,最后面的m个数移到最前面; 17.有n个人围成一个圈子,从第一个人开始报数,报到3的退下,问...

    leetcode第321题--offer-java:剑指offer

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 先将整型数组转换成String数组,然后将...

    《剑指Offer》题目及Java版代码(带目录)

    18. 把数组中的数排成一个最小的数:需要对数组进行排序,但排序的依据是字符串形式的比较。 19. 求第N个丑数:丑数是只包含质因数2、3、5的正整数,可以通过迭代的方式求出。 20. 第一个出现一次的字符:这通常...

    达内 coreJava 习题答案

    6、输出所有的水仙花数,把谓水仙花数是指一个数3位数,其各各位数字立方和等于其本身, 例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 class DafodilNumber{ public static void main(String[] args){ System.out....

    Java各种排序算法_随机数

    插入排序是最基本的一种排序算法,它将一个记录插入到已经排序好的有序表中。插入排序有直接插入排序和希尔排序两种,直接插入排序的时间复杂度为 O(n^2),而希尔排序的时间复杂度为 O(nlogn)。希尔排序是一种改进的...

    java排序总结[参考].pdf

    - **归并排序**:利用分治策略,将数组分成两半,分别排序,再合并成一个有序数组。 - **基数排序**:根据每个元素的每一位数字进行排序,通常用于处理整数排序。 2. **排序算法的选择策略**: - 对于小规模数据...

    《剑指Offer》题目及代码.pdf

    33. 把数组中的数排成一个最小的数:需要对数字进行排序,排序的依据是两个数字组成的字符串哪个更小。 34. 求第N个丑数:丑数是只包含质因数2、3和5的正整数。需要动态地构造丑数序列,每次从已有丑数中乘以2、3、...

    最新JAVA编程题全集_50题及答案

    程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=...

    java的Comparator和Comparable.docx

    如果 o1 应该排在 o2 之后,返回正整数。 在示例中,SampleComparator 类实现了 Comparator&lt;String&gt; 接口,并重写了 `compare` 方法。这个例子展示了如何将字符串 "一"、"二"、"三" 转换成对应的整数值进行排序,...

    程序设计基础答案

    对于一个三位的正整数 n,取出它的十位数字k(k为整型)的表达式是( )。 A) k = n / 10 % 10 B) k = ( n - n / 100 * 100 )%10 C) k = n % 10 D) k = n / 10 21.现有一变量声明为boolean aa;下面赋值语句中...

    java m取n 重复 不重复 排列组合 for循环嵌套递归

    1. **输入校验**:确保输入的n值不大于数组chs的长度,同时n应为正整数。 2. **性能优化**:随着n的增加,计算量会呈指数级增长。可以通过缓存中间结果等方式进行优化。 3. **异常处理**:增加对异常情况的处理逻辑...

    排序算法实现

    6. **堆排序**:堆排序是一种树形选择排序,它的基本思想是将待排序的序列构造成一个大顶堆或小顶堆,此时整个序列的最大值就是堆顶的根节点。然后将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素...

    第23届NOIP普及组C++语言试题

    设A和B是两个长为n的有序数组,现在需要将A和B合并成一个排好序的数组,任何以元素比较作为基本运算的归并算法在最坏情况下至少要做多少次比较?** - **解析**: 归并两个有序数组的最坏情况是比较次数等于数组的总...

Global site tag (gtag.js) - Google Analytics