剑指offeer:把数组排成最小的数

http://www.cnblogs.com/tobemaster/p/5911352.html

 

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

 

自己定义规则:s1+s2>=s2+s1  则规定 字符串s1>s2

按以上规则,对数组中的数进行冒泡排序,

然后按顺序拼接字符串并返回

 

public static String PrintMinNumber(int [] numbers) {
            //冒泡排序,大数往后靠
            for(int i=numbers.length-1;i>0;i--){
                for(int j=0;j<i;j++){
                    if(bigger(numbers[j]+"", numbers[j+1]+"")){
                        int temp = numbers[j];
                        numbers[j] = numbers[j+1];
                        numbers[j+1]=temp;
                    }
                }
            }
            StringBuilder sb = new StringBuilder();
            for(int n:numbers){
                sb.append(n);
            }
            return sb.toString();
        }
        
        //比较两个字符串合并后的大小, s1+s2>s2+s1 返回true,说明s1更大
        public static boolean bigger(String s1,String s2){
            char[] c1 = (s1+s2).toCharArray();
            char[] c2 = (s2+s1).toCharArray();
            int p1=0;
            int p2=0;
            while(p1<c1.length&&p2<c2.length){
                if(c1[p1]==c2[p2]){
                    p1++;
                    p2++;
                }else if(c1[p1]>c2[p2]){
                    return true;
                }else{
                    return false;
                }
            }
            
            
            return true;
        }

 

posted on 2017-08-27 22:13  zhangxiaoyu  阅读(129)  评论(0)    收藏  举报

导航