menu

剑指offer:33题

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 这个题的核心是将小的数排到前面(但这里说的小不是我们说的小,而需要定义一种比较关系)例如10比3小(因为103<310)32比321小(因为32132比32321小)。根据这种定义的关系将数组排序就可以完成。 import java.util.ArrayList;

public class Solution { public String PrintMinNumber(int [] numbers) { String str = “”; for (int i=0; i<numbers.length; i++){ for (int j=i+1; j<numbers.length; j++){ // Integer.valueOf()的作用是字符串转成int int a = Integer.valueOf(numbers[i] + “” + numbers[j]);//精华所在 // 两个字符串不是简单的加法,而是字符串拼接 int b = Integer.valueOf(numbers[j] + “” + numbers[i]);//精华所在 if (a > b) {// 按位比较,小的放在最前面 int t = numbers[i]; numbers[i] = numbers[j]; numbers[j] = t; }

        }
    }
    for (int i = 0; i < numbers.length; i++) {
		// String.valueOf()的作用是int转字符串
		str += String.valueOf(numbers[i]);// 此操作还是字符串拼接
    }
    return str;
} } 排序的话我们应该想到快速排序,上面用的双层循环冒泡法复杂度稍高。 quicksort()

public class Test24 { public static void main(String[] args) { int[] num={1,5,9,13,442,44,6,21,211}; qsort2(num,0,num.length-1); System.out.println(Arrays.toString(num)); } public static void qsort2(int [] nums,int beginIndex,int endIndex){ int i,j,index; if (beginIndex>=endIndex)return; i=beginIndex; j=endIndex; index=nums[beginIndex];//初始用首元素做轴 while(i<j){//从后面找小的,前面找大的,最终会空一个位置即中轴(i位置) while (i<j&&(myCompator(nums[j],index)>=0)) j–; if (i<j) nums[i++]=nums[j];//从后往前遇到小的就换前面去 while (i<j&&(myCompator(nums[i],index)<0))//开始从前往后 i++; if (i<j) nums[j–]=nums[i]; } nums[i]=index; qsort2(nums,beginIndex,i-1); qsort2(nums,i+1,endIndex);

}

    public static int myCompator ( int m, int n)
    {
        String m1 = String.valueOf(m);
        String n1 = String.valueOf(n);
        String temp1 = m1 + n1;
        String temp2 = n1 + m1;
        return temp1.compareTo(temp2);//这个方法如果前面大就返回一个正数,如果后面大就返回一个负数,相等返回0
    }
}
除此之外还可以用Collects.sort实现的比较器Comparator
public class Test24 {
public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1,5,9,13,442,44,6,21,211);
    //int[] num={1,5,9,13,442,44,6,21,211};
    Collections.sort(nums, new Comparator<Integer>() {
        @Override
        public int compare(Integer m, Integer n) {
            String m1 = String.valueOf(m);
            String n1 = String.valueOf(n);
            String temp1 = m1 + n1;
            String temp2 = n1 + m1;
            return temp1.compareTo(temp2);
        }
    });
    //qsort2(num,0,num.length-1);
    String result="";
    for (int i=0;i<nums.size();i++)
    {
        System.out.println(nums.get(i));
        result=result+nums.get(i);
    }
    System.out.println("最小的组合值为:"+result);

}

还没想好

各种分享

微信搜索号: iris
wechat 微信号:ly.c