把数组排列成最小的数

来源:互联网 发布:淘宝女装客服话术 编辑:程序博客网 时间:2024/06/08 16:57

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

思路一:
排列出数组所有可能的组合,找出其中最小的数。难点在于求所有可能的组合,求解过程和求一串字符的字典序类似。如下所示:
这里写图片描述
(图片来源于网络)
伪代码如下:

mothed(int[] arr, int start, int end)tmp = min(arr, tmp);for each i in [start, end]    swap(i, start);    mothed(start+1, end);    swap(i, start);

真实代码如下:

public class Main {    static String min = null;    public static void main(String args[]) {        int[] arr = {3, 32, 321};        StringBuffer first = new StringBuffer();        for(int t : arr)            first.append(t);        min = first.toString();        findMin(arr,0, arr.length - 1);        System.out.println(min);    }    public static void findMin(int[] arr, int start, int end) {        if (start <= end) {            StringBuffer sb = new StringBuffer();            for (int k : arr)                sb.append(k);            if(min.compareTo(sb.toString()) > 0)                min = sb.toString();            for (int i = start; i <= end; i++) {                swap(arr, start, i);                findMin(arr, start + 1, end);                swap(arr, start, i);            }        }    }    public static void swap(int[] arr, int index1, int index2) {        int t = arr[index1];        arr[index1] = arr[index2];        arr[index2] = t;    }}

算法特性:
空间复杂度较高,时间复杂度也高;
输出:

321323

思路二:
从题目中可以发现: 以32 和 3 的组合为例,要是排列后数最小,必须32 在 3 之前,同理 321 必须在 32 之前。那么定义一种比较规则:
对于整数 x 和 y,xy表示x和y按顺序拼接后的整数
if xy > yx , then x > y;
if xy < yx , then x < y;
else x = y;
于是思路就明了了,先利用Arrays.sort()按定义的比较规则对输入数组进行排序,再将数组按次序拼接,得到的值即为最小数。

public class Main {    public static void main(String args[]) {        Integer[] arr = {3, 32, 321};        Arrays.sort(arr, new Compare());        StringBuffer sb = new StringBuffer();        for (int i : arr)            sb.append(i);        System.out.println(sb);    }}class Compare implements Comparator<Integer> {    @Override    public int compare(Integer i1, Integer i2) {        return (String.valueOf(i1) + String.valueOf(i2)).compareTo(String.valueOf(i2) + String.valueOf(i1));    }}

输出:

321323

算法特性:时间复杂度相对较低O(nlogn),但是空间复杂度较高O(nlogn).
String.valueOf(i1) + String.valueOf(i2)先根据i1和i2生成两个String对象,拼接在一起生成第三个String对象。每比较一次,均要生成多个String对象,因此空间复杂度为O(nlogn).

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 SVN提交时代码冲突怎么办 京东自营没货了怎么办 京东下了单 没货怎么办 万达广场购物卡怎么办 京东白条没额度怎么办 京东退款还收到货怎么办 退货不想要货了怎么办 安装微擎创建数据库失败怎么办 tp文件损坏或丢失怎么办 手机QQ启动有问题应该怎么办 微信网页版页面巨大怎么办 魔兽军团烹饪食谱扔了怎么办 赴港旅游网上签证怎么办了? 美团商家入住没有营业执照怎么办 团购房子不想要怎么办 乐视液晶屏坏了怎么办 wifi盒子插上网线然后怎么办 在泰国手机坏了怎么办 朋友在泰国手机关机怎么办 qq上转账转错了怎么办 扣扣转账转错了怎么办 到付快递签收了怎么办 京东白条消费了怎么办 确认收货点错了怎么办 小米6后盖缝隙大怎么办 苹果6splus电池不耐用怎么办 苹果一朵云加箭头下载不了怎么办 苹果8p信号不好怎么办 苹果8p像素不好怎么办 美版iphonex有锁怎么办 苹果8x突然黑屏怎么办 苹果6s无法激活怎么办 苹果6sp激活出错怎么办 小米4c触屏失灵怎么办 手机谷歌浏览器为什么打不开怎么办 谷歌浏览器打不开网址怎么办 拼多多被限制了怎么办 保时捷11年的前机盖打不开怎么办 唯品会衣服质量有问题怎么办 唯品会买的东西有质量问题怎么办 唯品会上卖到假东西怎么办