每日一题--把数组排成最小的数

题目分析:找到一个排序规则,将数组排序。这个规则比较两个数m和n哪个排在前面值会比较小(用字符串大小比较来比较 mn>nm)
重要推导:根据这种比较规则把数组排序后,将数组中所有数字拼接起来得到的数字是最小的(反证法

这里写图片描述
代码:


 * 问题描述:输入一个正整数数组,将数组中所有数字拼接起来排成一个数,打印拼接出的所有数中最小的一个
 * 输入:{3,32,321}
 * 输出:321323
 * Created by lxq on 2017/9/6.
 */
public class Problem4 {
    public void PrintMin(int[] array){
        //为什么要拷贝一份
        int[] clone = array.clone();
        printMinNumber(clone,0,clone.length-1);
        for(int i:clone)
            System.out.println(i);
    }


 /*
  根据新定义的比较规则来排序这个数组
 /*
    private void printMinNumber(int[] array, int start, int end) {
        if(start<end){
            int main_number = array[end]; //设置了一个标志量
            int small_cur = start;  //遇到小的就过去了(+1),遇到大的就停止
            //二分排序
            for(int j=start;j<end;j++){
                if(isSmall(String.valueOf(array[j]),String.valueOf(main_number))){
                    int temp = array[j];
                    array[j] = array[small_cur];
                    array[small_cur] = temp;
                    small_cur++;
                }
            }
            //最后将end和small_cur交换一下,左边都是比标志量小的,右边都是比它大的
            array[end] = array[small_cur];
            array[small_cur] = main_number;
            //递归调用,两边
            printMinNumber(array,0,small_cur-1);
            printMinNumber(array,small_cur+1,end);
        }
    }


    //重新定义比较两个字符串的规则
    private boolean isSmall(String m, String n) {
        String left = m+n;
        String right = n+m;
        boolean result = false;
        for(int i =0;i<left.length();i++){
            if(left.charAt(i)<right.charAt(i))
                return true;
            else if(left.charAt(i)>right.charAt(i))
                return false;
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值