剑指offer-把数组排成最小的数(list 的元素排序)

直接开门见山吧。
有很多时候我们要将一些元素存进list中,并且需要根据它的一些属性排序。
这时候我们就有两种方式。
1、继承comparable,重写其中的compareTo方法。
重写compareTo方法时,因为参数为object,所以需要先将object强转成对应的类型。
2、实现Comparator接口,重写public int compare(Object o1, Object o2) 方法。如下:
Collections.sort(list, new Comparator() {
@Override
public int compare(String o1, String o2) {
//此处为判断大小的条件
}

但是当我们知道了这些还是远远不够的,我们更加需要通过很多练习来判断该如何写它的排序条件。虽然有很多题都是只需要根据其中的元素属性直接比较大小就好,但是我认为这还远远不够。
比如说在做剑指offer中的一道名为“把数组排成最小的数” 的算法题时,题目要求使得将数组中的数拼接起来的数字最小。这道题就用到了对list的排序。下面是题目描述。

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

我们会发现不单纯的是对数组中的元素进行比较大小,它要实现的应该是判断数组中每一个元素,在最后拼接成的那个结果中所在的位置。
举个例子
12 2
这两个数字该如何排序使得结果最小?我相信大家都能一眼看出(也可能需要两眼,哈哈)
122。
不知道大家有没有这样的感觉,很多时候我们的大脑反应是足够快的,快到我们不知道我们是如何得出某些结论的。
但是要做题,我们就得搞清楚它背后的逻辑。所以我们就得慢下来。
当我们看到这两个数时,肯定是把122与212进行了比较,那么现在我们就抓住了这个题的“小辫子”。即 当我们需要判断某个元素的位置时,我们需要做的是,将它与每一个元素进行两次拼接(一次在前,一次在后)比较这两次的结果,便能得出这两个数的”相对位置“。
接着我们就是实现comparator并且重写compare了。
Collections.sort(list, new Comparator(){}
那么compare该如何写呢?
首先 需要拼接 ,如下
String s1=str1+""+str2;
String s2=str2+""+str1;

然后就是比较了。比较可以有很多种做法,
下面这种做法就很让我触动。(可能是因为之前只见过对象调用)
return s1.compareTo(s2);
下面是完整的代码。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        int n;
        String s="";
        ArrayList<Integer> list=new ArrayList<Integer>();
        n=numbers.length;
         
        for(int i=0;i<n;i++){
            list.add(numbers[i]);//将数组放入arrayList中
        }
        //实现了Comparator接口的compare方法,将集合元素按照compare方法的规则进行排序
        Collections.sort(list,new Comparator<Integer>(){
         
            @Override
            public int compare(Integer str1, Integer str2) {
                // TODO Auto-generated method stub         
                    String s1=str1+""+str2;
                    String s2=str2+""+str1;
                     
                    return s1.compareTo(s2);
                }
            });
         
        for(int j:list){
            s+=j;
        }
        return s;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值