剑指offer(34):把数组排成最小的数
来源:互联网 发布:淘宝怎么才能搜到黄盘 编辑:程序博客网 时间:2024/05/29 18:49
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
直接做法:
求出这个数组中所有数字的全排列,求出拼起来的数字中的最小值即可。此时n个数字共有n!个排列。
另外一种思路是:
寻找一种排序规则,按照该规则排序之后能够排成一个最小的数字。两两相邻的两个数字m、n,简单组合为mn、nm,对mn、nm进行大小排序,对所有数字按照该规则进行排序,则容易得到最小的而数字。考虑到题目并没有对数字的大小进行限制性的描述,2个int类型的数字组合后很可能发生溢出。因此需要解决隐藏的大数问题。将数字数组转为字符串数组后,两个字符串直接相加“+”操作就能够实现原来的相邻数字的两两组合。考虑到java.util.Arrays类库中提供了Arrays.sort()方法(时间复杂度为O(nlogn),已经远小于直接求全排列的n!),指定排序规则的匿名类Comparator,如果对时间效率没有更高的要求,就可以使用这种方法。
下面为牛客AC代码:
import java.util.Arrays;import java.util.Comparator;public class Solution { public String PrintMinNumber(int [] numbers) { if(numbers == null || numbers.length <= 0) return ""; // 转为String数组 int length = numbers.length; String[] strArr = new String[length]; for(int i = 0; i < length; i++) { strArr[i] = String.valueOf(numbers[i]); } // 匿名类指定比较器,指定排序规则进行排序 Arrays.sort(strArr, new Comparator<String>() { public int compare(String str1, String str2) { return (str1 + str2).compareTo(str2 + str1); } }); // 将从小到大的字符串数组组合为最小字符串,即最小数字 StringBuffer sb = new StringBuffer(); for(String str : strArr) { sb.append(str); } return sb.toString(); }}
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社
0 0
- 剑指offer(34):把数组排成最小的数
- 剑指offer(29)-把数组排成最小的数
- 剑指offer:把数组排成最小的数(java)
- 剑指offer-把数组排成最小的数(Java)
- 把数组排成最小的数(剑指Offer)
- 剑指offer-33:把数组排成最小的数
- 剑指offer:把数组排成最小的数
- 【剑指offer】把数组排成最小的数
- 【剑指offer】Q33:把数组排成最小的数
- 九度《剑指offer》把数组排成最小的数
- 剑指Offer之把数组排成最小的数
- 剑指offer系列源码-把数组排成最小的数
- 剑指offer 33 把数组排成最小的数
- 剑指offer--把数组排成最小的数
- 剑指offer之把数组排成最小的数
- 《剑指offer》把数组排成最小的数
- 剑指offer:把数组排成最小的数
- 【剑指Offer】把数组排成最小的数
- leetcode之Add Digits
- 用小猫统计制作运动员评价管理系统:导入下拉列表内容(固定值列表)
- Win32实现迷宫
- PAT-B 1002. 写出这个数
- Android 判断当前系统语言
- 剑指offer(34):把数组排成最小的数
- makefile-2
- kubernetes理论之kubernetes组成
- AOJ 0118 Property Distribution (果园分类)
- opencv Mat详解
- 用户在对话框下拉列表中选择的为显示文本区中的文本
- 【排序算法】冒泡排序原理及Java实现
- HTML编码规范
- OLAP(联机分析处理)和OLTP (联机事务处理)的区别