编程题:输入一个正整数数组,将他们拼接成一个数,输出拼接出所有数字中最小的一个

注意:最近有朋友指出了该做法并不正确,特此声明,当然,希望有大神可以来改正一下,本人能力有限,只能换一种方法去做。

错误做法:

public class Demo {     //错误原因:跟Arrays.sort的排序方式有关s

    /**
     * 编程题:输入一个正整数数组,将他们拼接成一个数,输出拼接出所有数字中最小的一个
     */
    public static void main(String[] args) {
        int [] arr = {20, 321, 21 ,10,8};          //要求输出1020213218
        
        StringBuffer sbBuffer = new StringBuffer();
        
        for (int i = 0; i < arr.length; i++) {      //利用StringBuffer将数组拼接成字符串
            if(i == (arr.length -1 )){
                sbBuffer.append(arr[i]);            //最后一个不加空格
            }else{
                sbBuffer.append(arr[i] + " ");    //拼接时加上空格,以便正则split的使用
            }
        }
        
        System.out.println(sbBuffer);          //输出拼接的结果
         //熟悉正则match()、split()
        String[] strs = sbBuffer.toString().split(" ");        //利用正则split根据空格,将字符串转成字符串数组    
        
        Arrays.sort(strs);                                                   //利用Arrays.sort()进行数组的排序
        
        StringBuffer sbBuffer2 = new StringBuffer();    
        for (int i = 0; i < strs.length; i++) {                      //排序之后再拼接成字符串,即可得到结果
            
                sbBuffer2.append(strs[i]);
        }
        System.out.println(sbBuffer2);
    }
}


正确做法:

/**
 * 编程题:输入一个正整数数组,将他们拼接成一个数,输出拼接出所有数字中最小的一个
 * 思路:对于两个字符串重新定义其大小规则,比如:给定两个字符串s1,s2,如果(s1+s2)>(s2+s1) 那么s1>s2,反之s2>s1
 */
public class Demo1{

	public long newSort(long []arr) {  //用长整型以免数据易于溢出
		long result;
		List list=new ArrayList();
		
		//转为字符串数组,利用Comparator比较
		for (long i:arr) { //第一种for循环输出方法;注意这里遍历输出的是对象
			list.add(String.valueOf(i));
		}
		
             /*	for (int i = 0; i < arr.length; i++) { //第二种传统的遍历输出方法;两者等同
			long a=arr[i];
			list.add(String.valueOf(a));
		}*/
		
		//自定义比较并排序
		Collections.sort(list, new Comparator(){
			public int compare(String o1, String o2) {
				String m=o1+o2;
				String n=o2+o1;
				return m.compareTo(n);
			}
		});
		
		//最后将排好序的字符串进行拼接得出结果
		StringBuffer sBuffer=new StringBuffer();

		for (String str : list) {
			sBuffer.append(str);
		}
		result=Long.parseLong(sBuffer.toString());
		return result;
	}
	
	public static void main(String[] args) {

		        long []a={3,32,321};
			long []b={152,203,32,54,56,8};
			Demo1 demo=new Demo1();
			long c=demo.newSort(b);
			long d=demo.newSort(a);
			System.out.println(c+"\r"+d);
	}
}



你可能感兴趣的:(java)