把数组排成最小的数

把数组排成最小的数

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

把数组排成最小的数

第一种方法:耗时21ms

由题可知我们需要对数组中的数进行排序。那么排序需要满足满足什么规则呢?
首先,我们并不能直接用(o1,o2)->o2.compareTo(o1),因为很明显当数字一样大时长度并不能作为排序的依据。该题的正确解法为短的字符串循环与长的字符串作比较,代码如下:

public String PrintMinNumber(int [] numbers) {
        ArrayList<String> arrayList = new ArrayList<String>();
        for(int i : numbers){
            arrayList.add( i + "" );
        }

        Collections.sort(arrayList, new Comparator<String>() {

            public int compare(String o1, String o2) {
                int i = 0, j = 0;
                while(i < o1.length() || j < o2.length()){
                    if(j==o2.length()) j-=o2.length();
                    if(i==o1.length()) i-=o1.length();
                    if(o1.charAt(i) < o2.charAt(j)){
                        return -1;
                    }else if(o1.charAt(i) > o2.charAt(j)){
                        return 1;
                    }
                    i++; j++;
                }
                return 0;
            }
        });

        StringBuilder stringBuilder2 = new StringBuilder();
        for(String s : arrayList){
            stringBuilder2.append(s);
        }
        return stringBuilder2.toString();
    }

第二种方法:耗时160ms

这种方法很有意思,利用了贪心的思想,既然整个序列是最小的,那么越靠前的序列肯定也是最小的,任何两个序列的组合也是较小的。同时将两个字符串按不同顺序相加得到的长度也是相等的,此时就可以简单地使用compareTo的方法来做比较。代码如下:

public String PrintMinNumber(int [] numbers) {
        ArrayList<String> arrayList = new ArrayList<String>();
        for(int i : numbers){
            arrayList.add( i + "" );
        }

        Collections.sort(arrayList, (o1,o2)->(o1+o2).compareTo(o2+o1));

        StringBuilder stringBuilder2 = new StringBuilder();
        for(String s : arrayList){
            stringBuilder2.append(s);
        }
        return stringBuilder2.toString();
    }
全部评论
在您的答案稍加改动,可以看一下 public String PrintMinNumber(int [] numbers) {         ArrayList<String> arrayList = new ArrayList<String>();         for(int i : numbers){             arrayList.add( i + "" );         }         Collections.sort(arrayList, new Comparator<String>() {                          public int compare(String o1, String o2) {                 int i = 0, j = 0;                 while(i < o1.length() && j < o2.length()){                     if(o1.charAt(i) < o2.charAt(j)){                         return -1;                     }else if(o1.charAt(i) > o2.charAt(j)){                         return 1;                     }                     i++; j++;                 }                 while(i < o1.length()){//2到达了终点                     if(j==o2.length()) j-=o2.length();                     if(o1.charAt(i) < o2.charAt(j)){                         return -1;                     }else if(o1.charAt(i) > o2.charAt(j)){                         return 1;                     }                     i++;j++;                 }                 while(j < o2.length()){                     if(i==o1.length()) i-=o1.length();                     if(o1.charAt(i) < o2.charAt(j)){                         return -1;                     }else if(o1.charAt(i) > o2.charAt(j)){                         return 1;                     }                     i++;j++;                 }                 return 0;             }         });         StringBuilder stringBuilder2 = new StringBuilder();         for(String s : arrayList){             stringBuilder2.append(s);         }         return stringBuilder2.toString();     } }
3 回复
分享
发布于 2019-08-10 22:37
并不应该和位数短的后一位比较吧。 比如1234和123413比较,应该比较1-1,2-2,3-3,4-4,1-1,2-3,即短位数到达终点后再重新从起点开始接着比较,直到二者都经历一轮。
2 回复
分享
发布于 2019-08-10 22:33
滴滴
校招火热招聘中
官网直投
方法2时间耗在了lambda表达式上,使用匿名内部类会快很多
1 回复
分享
发布于 2020-02-20 10:38
这里面的compareto是什么意思能讲讲吗
点赞 回复
分享
发布于 2019-08-21 16:55
方法1的while循环,如果比较的两个数是111和1111,是否会出现循环不停止的情况
点赞 回复
分享
发布于 2020-10-05 12:32

相关推荐

头像
04-29 10:53
已编辑
东北大学 自动化类
点赞 评论 收藏
转发
23 收藏 评论
分享
牛客网
牛客企业服务