本文主要是介绍【剑指offer】之把数组排成最小的数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析:
这道题主要要自定义一个比较方法myCompare(),这个方法比较的是两个数字不同组合的大小,例如:于数字m和n,比较其组合mn和nm的大小。使用的排序可以是任何的排序算法,只要把其中的比较大小的方法换成myCompare(),得到的最终排序结果就是最小的一个组合数字。
java代码实现:
//输出整数数组的最小组合数字private static void printMinNumbers(int []numbers) {if(numbers == null || numbers.length < 0) {return ;}sort(numbers);for(int i=0;i<numbers.length;i++) {System.out.print(numbers[i] + "");}}//归并排序算法public static void sort(int[] obs) {sort(obs,0,obs.length-1) ;}private static void sort(int[]obs, int left, int right) {if (left < right) {int mid = (left + right) / 2;sort(obs,left, mid);sort(obs,mid + 1, right);mergeSort(obs,left, mid, right);}}private static void mergeSort(int[]obs, int left, int mid, int right) {int[] tempObj = new int[obs.length];int _left = left ;int _mid = mid+1 ;int temp = left ;while(_left <=mid && _mid <=right) {if(compare(obs[_left],obs[_mid])) {tempObj[temp++] = obs[_left++];} else {tempObj[temp++] = obs[_mid++];}}while(_left<=mid) {tempObj[temp++] = obs[_left++];}while(_mid<=right) {tempObj[temp++] = obs[_mid++];}while(left <= right) {obs[left] = tempObj[left++] ;}}//比较两个数字的两种组合的数字大小private static boolean compare(int number1, int number2) {String str1 = number1 + number2 + "";String str2 = number2 + number1 + "";if(str1.compareTo(str2) < 0) {return true;}return false;}
测试函数
public static void main(String[] args) {int []numbers = {3,32,321};printMinNumbers(numbers);}
输出结果:321323
这篇关于【剑指offer】之把数组排成最小的数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!