[编程题]把数组排成最小的数

把数组排成最小的数

http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993

先说一下运行时间12m 速度来说还是可以的,思路简单,就是写的有点长。更改快排的判断条件就可以了
再说一下方法,简单而言,这就是一个排序,不过判断条件不一样而已,以快速排序为例,设置原有的判断条件改为两个整数连接起来谁比较大。所以这里用了一个笨方法来比较:

    public boolean Comp(int a,int b){
        String s1=String.valueOf(a);
        String s2=String.valueOf(b);
        String str1=s1.concat(s2);
        String str2=s2.concat(s1);
//        if(Integer.parseInt(s1.concat(s2))<=Integer.parseInt(s2.concat(s1)))
//            return true;
        for(int i=0;i<str1.length()-1;i++){
            if(str1.charAt(i)==str2.charAt(i)){
                continue;
            }else if(str1.charAt(i)<str2.charAt(i)){
                return true;
            }else{
                return false;
            }
        }
        return true;
    }

这里判断是不是前一个数字在前面组成的数字比较小,如果ab<ba就返回true。
顺便提一下,这里的比较本来想用字符串连接后转Int比较的,但是调试的时候越界了,所以就改成了一个一个字符来比较大小。所以后面的快速排序的方法就照搬就可以了。

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public String PrintMinNumber(int [] numbers){
        if(numbers.length==0) return "";
        if(numbers.length==1) return String.valueOf(numbers[0]);
        QuickSort(numbers,0,numbers.length-1);
        String str=String.valueOf(numbers[0]);
        int start=0;
        int end=numbers.length-1;
        int index=Partition(numbers,start,end);
        for(int i=1;i<numbers.length;i++){
            str=str.concat(String.valueOf(numbers[i]));
        }
        return str;
    }
    public void QuickSort(int[] arr,int left,int right){
        if(left<right){
            int index=Partition(arr,left,right);
            QuickSort(arr,left,index-1);
            QuickSort(arr,index+1,right);
        }
    }
    public int Partition(int[] arr,int l,int r){
        int pivot=arr[l];
        while(l<r){
            while(l<r&&Comp(pivot,arr[r]))
                r--;
            if(l<r)
                arr[l++]=arr[r];
            while(l<r&&Comp(arr[l],pivot))
                l++;
            if(l<r)
                arr[r--]=arr[l];
        }
        arr[l]=pivot;
        return l;
    }
    public boolean Comp(int a,int b){
        String s1=String.valueOf(a);
        String s2=String.valueOf(b);
        String str1=s1.concat(s2);
        String str2=s2.concat(s1);
//        if(Integer.parseInt(s1.concat(s2))<=Integer.parseInt(s2.concat(s1)))
//            return true;
        //if(str1.equals(str2)) return true;
        for(int i=0;i<str1.length()-1;i++){
            if(str1.charAt(i)==str2.charAt(i)){
                continue;
            }else if(str1.charAt(i)<str2.charAt(i)){
                return true;
            }else{
                return false;
            }
        }
        return true;
    }
}
全部评论

相关推荐

昨天 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务