一个能将给定非负整数数组中的数字排列成最大数字的函数

时间:2015-05-15 09:09:39   收藏:0   阅读:164

最近在网上看到这样一个题目,自己琢磨了一下。

java version "1.8.0_40"

//	编写一个能将给定非负整数数组中的数字排列成最大数字的函数。
//	例如,给定[50,2,1,9],最大数字为95021。
public class Sort {
	
	public static void main(String args[]){
		int number[] = {1,2,3,32,335,34,7,6,9};
		int number1[] = {312,321,3354,222,8};
		System.out.println(SortMax(number));
		System.out.println(SortMax(number1));
	}
	
	public static String SortMax(int num[]){
		int number[] = new int[num.length];
		for (int i = 0; i < num.length; i++) {
			number[i] = num[i];
		}
		int max = 0;
		int min = 0;
		StringBuffer s = new StringBuffer();
		for (int i = 0; i < number.length; i++) {
			for (int j = i + 1; j < number.length; j++) {
				Integer x = number[i];
				Integer y = number[j];
				int tempX = Integer.parseInt(x.toString() + "" + y.toString());
				int tempY = Integer.parseInt(y.toString() + "" + x.toString());
				//关键点,转为String类型拼接起来,再转回int类型进行比较
				if(tempX > tempY){
					max = x;
					min = y;
				}
				else{
					max = y;
					min = x;
				}
				number[i] = max;
				number[j] = min;
			}
		}
		for (int i = 0; i < number.length; i++) {
			s.append(number[i]);
		}
		return s.toString();
	}
}
/*Output:
9763433533221
83354321312222
*///:输出String类型
程序的关键点在于拼接比较大小。两个for循环嵌套实现排序。x和y是Integer对象。内层for循环开始时就要进行一次赋值。我始终是用number[i]来进行比较。


如果不重新赋值,会造成意想不到的错误。比如下面这个例子,在内层for循环前初始化x。

//	错误示范
//	未重新初始化对象
public class Sort {
    
    public static void main(String args[]){
        int number[] = {1,2,3,32,335,34,7,6,9};
        int number1[] = {9,8,55,222,8};
        System.out.println(SortMax(number));
        System.out.println(SortMax(number1));
    }
    
    public static String SortMax(int num[]){
        int number[] = new int[num.length];
        for (int i = 0; i < num.length; i++) {
            number[i] = num[i];
        }
        int max = 0;
        int min = 0;
        StringBuffer s = new StringBuffer();
        for (int i = 0; i < number.length; i++) {
            Integer x = number[i];    //把x放到内层for循环前面
            for (int j = i + 1; j < number.length; j++) {  // 差异处
                Integer y = number[j];
                int tempX = Integer.parseInt(x.toString() + "" + y.toString());
                int tempY = Integer.parseInt(y.toString() + "" + x.toString());
                //关键点,转为String类型拼接起来,再转回int类型进行比较
                if(tempX > tempY){
                    max = x;
                    min = y;
                }
                else{
                    max = y;
                    min = x;
                }
                number[i] = max;
                number[j] = min;
            }
        }
        for (int i = 0; i < number.length; i++) {
            s.append(number[i]);
        }
        return s.toString();
    }
}
/*Output:
911111111 这是个错误的结果
98855222 这个结果竟是正确的
*///:输出String类型
在这个错误范例中,内层for循环跑完一次后,Integer对象y被回收,对象x包含的值是1。number[0] == 2 ,number[1] ==1,x的value为1。内层for循环中j = 2,

对象x的值1会与number[2]进行比较。排序后,number[2] == 1,number[0] == 3。以此类推,数组number接下来的值都会变成1。


评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!