给定一个任意长度的java数组,求数组内的数能组合出来的最大整数

在美团的电话面试一面中被问到这样的问题,当时最先想到的是用全排列,然后挑出最大的一个,虽然问题可以解决,但是太暴力而且时间复杂度太大。后来想到可以通过快排直接排好序,输出就是最大值。时间复杂度也可以接受。

用快排实现的最大的难点就是怎么进行比较规则的设计。将给的整形转化为字符串string类型比较大小,规则设计如下:当str1 是str2 的从头开始的一部分,则str1>str2例如‘91’ 大于‘919’;否则调用string.compareTo()方法比较大小。具体代码如下:

代码中regionMatches()函数作用:

将此对象的子字符串与参数的子字符串进行比较。如果这两个子字符串表示相同的字符序列,则结果为true,当且仅当 ignoreCase 为 true 时忽略大小写。要比较的此String对象的子字符串从索引toffset处开始,
长度为len。要比较的 other的子字符串从索引ooffset处开始,长度为len。当且仅当下列至少一项为 true 时,结果才为 false,也可以自己写,只是犯懒了,就查了一下API。

package quickSort;

public class QuickSort {

	public static int getMid(int array[], int low, int high) {
		int temp = array[low];
		while (low < high) {
			while (low < high && bigger(temp,array[high])) {
				high--;
			}
			array[low] = array[high];

			while (low < high && bigger(array[low],temp)) {
				low++;
			}
			array[high] = array[low];
		}
		array[low] = temp;
		return low;
	}


	public static void quickSort(int[] array, int low, int high) {
		if (low < high) {
			int mid = getMid(array, low, high);
			quickSort(array, low, mid - 1);
			quickSort(array, mid + 1, high);
		}
	}
	
	public static boolean bigger(int a, int b){
		String str1 = String.valueOf(a);
		String str2 = String.valueOf(b);	
		if(str1.regionMatches(0,str2,0,str1.length()) == true 
				&& str1.length() <= str2.length()){

			//当类似9 和99比较时返回true,即'9'>"99"
			return true;	
		}
		char [] arr1 = str1.toCharArray();
		int len1 = arr1.length;
		
		char [] arr2 = str2.toCharArray();
		int len2 = arr2.length;
		
		if(str1.compareTo(str2) > 0){//字符串比较
			return true;
		}
		return false;
	}


	public static void main(String[] args) {
		int a[] = new int[] { 9,99,909,9901,8 };
		quickSort(a, 0, a.length - 1);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] +"  ");
		}
	}
	//结果9  99  9901  909  8 
}

在百度上也搜到另外一种方法,感觉不好理解,给大家粘出来参考一下。http://zhidao.baidu.com/link?url=77WvVjzCFPeV-UGgHZAbJJ5grsSVcvjjZX3mtE_9EEYl5pyIXnM9zGalsd5k19DFs6vBgybGyGvPLYRUOlcrNw8X1O67QvXVzvDmsHnX_ha

你可能感兴趣的:(排序算法)