把数组排成最小的数

声明:本片文章为阅读何海涛网易日志后,自己用java实现后的学习总结。

何海涛日志:http://zhedahht.blog.163.com/blog/static/25411174200952174133707/

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

思路:这个题目很类似于排序,但是又和排序有着明显的不同,例如32和321,如果按照正常的排序比较,321>32,但在本题中,321排在32前面,其实通过观察,我们可以将321和32做字符串拼接,拼接完成后进行判断。

例如321 + 32 = 32132; 32 + 321 = 32321 我们发现32132<32321,所以321排在32前面,组成的数字更小,所以我们可以将排序的规则变为字符串比较。

代码:

/**
 * 题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
 * @author hongbin.gao
 *
 */

public class PrintMinNumber {
	public static void main(String[] args){
		int[] nums = {945,8,7,631,6325,4,3,2,1};
		printMinNumber(nums,0,nums.length-1);
		for(int i = 0;i<nums.length;i++)
		   System.out.println(nums[i]);
	}
	public static void printMinNumber(int[] nums,int low, int high){
		if(high == low || high == low+1)
			return ;
		
		int temp =0;
		
		for(int j = low;j<high;j++){
			int p1 = nums[j];
			int index = j;
			for(int i=j+1;i<=high;i++){
				if(!compareString(p1,nums[i])){
					p1 = nums[i];
					index = i;
				}
			}
			temp = nums[j];
			nums[j] = p1;
			nums[index] = temp;
		}
	}
	public static boolean compareString(int p1, int p2){
		String str1 = new String(p1+""+p2+"");
		String str2 = new String(p2+""+p1+"");
		
		int length = str1.length(); //str1和str2的长度时相同的
		
		int i=0;
		char c1,c2;
		while(i<length){
			c1 = str1.charAt(i);
			c2 = str2.charAt(i);
			if(c1 < c2)  //p1<p2
				return true;
			else if(c1 > c2) //p1>p2
				return false;
			
			i++;
		}
		
		return true;  //如果两个数字例如为321321和321则返回true
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值