《剑指offer》面试题33:把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。

理论基础:数组排列后拼接的数字最小,则内部任意两个拼接的数字最小。因此,只需要比较数组中任意两个的大小。

思路:外部采用快排(logn),进行比较;内部的比较采用 (str1+str2) ? (str2+str1)。

标答:

public String MinNumber(int[] nums) {
	List<Integer> list = new ArrayList<Integer>();
	for (int i=0; i<nums.length; i++)
		list.add(nums[i]);
	
	Collections.sort(list, new Comparator<Integer>() {

		@Override
		public int compare(Integer o1, Integer o2) {
			// TODO Auto-generated method stub
			String s12 = "" + o1 + o2;
			String s21 = "" + o2 + o1;
			return s12.compareTo(s21);
		}
		
	});
	String res = "";
	for (int n : list)
		res += n;
	return res;
}
答二:
public String MinNumber(int[] nums) {
	String[] s = new String[nums.length];
	for (int i=0; i < nums.length; i++) {
		s[i] = "" + nums[i];
	}
	s = helpMinNumberQuickSort(s, 0, s.length-1);
	
	String res = "";
	for (int j=0; j<s.length; j++)
		res += s[j];
	
	return res;
}
// 快排
public String[] helpMinNumberQuickSort(String[] s, int start, int end) {
	int i = start, j = end;
	String key = s[start];
	while (i != j) {
		if (!helpQuickSortCompare(key, s[j]) && i<j)
			j--;
		s[i] = s[j];
		if (helpQuickSortCompare(key, s[j]) && i<j)
			i++;
		s[j] = s[i];
	}
	s[i] = key;
	
	if (i-1 > start)
		helpMinNumberQuickSort(s, start, i-1);
	if (j+1 < end)
		helpMinNumberQuickSort(s, j+1, end);
	return s;
}
// 快排中比较两个str大小,根据正反连接后的str大小比较
public boolean helpQuickSortCompare(String str1, String str2) {
	String ss12 = str1 + str2;
	String ss21 = str2 + str1;
	System.out.println(str1 +" " + str2 +" " +ss12.compareTo(ss21));
	if (ss12.compareTo(ss21) >= 0) 
		return true;
	else
		return false;
}
参考:https://blog.csdn.net/gg543012991/article/details/52601195

猜你喜欢

转载自blog.csdn.net/qq_25024883/article/details/80340252
今日推荐