求数组排列的范围
来源:互联网 发布:制作身份证软件 编辑:程序博客网 时间:2024/05/14 14:57
问题描述:给定一个整数数组,将这个整数数组排列成一个整数,并且数组的每个元素都要用到,求所排列出的整数的范围。
分析:这是一个很有意思的题目,初看好像是要求所有排列情况的最小值和最大值,当然这样做也可以求出来,只不过时间复杂度过高,
另外还有一个问题是大数问题,所排列成的数可能范围很大,超过了基本数据类型所能表示的范围,因此需要转换为字符串处理。
下面详细介绍解法:
解法一:用排列法。也就是求出这个数组的全排列,然后求出这个排列的最小值和最大值。由于排列要用到递归实现,
递归一般消耗系统大量的时间和空间,因此该方法效率略低。
解法二:直接求出排列的最大值和最小值。先介绍一种方法,对于两个整数a和b,排列成一个整数后有两种结果ab和ba,
这里我们定义了一种新的大小规则,
如果ab>ba,我们就认为a>b;
如果ab=ba,我们就认为a=b;
如果ab<ba,我们就认为a<b;
这不同于数学中的大小规则,为了解决大数问题,先将整数数组转化为字符串数组,在进行比较。具体算法如下:
第一步:将整数数组转换为字符串数组。
第二步:将这个字符串数组按照我们新定义的大小规则进行排序。
第三步:将排序后的数组串连成一个字符串,这个字符串就是所要求的最小值。
第四步:将第三步字符串逆序就是所要求的最大值。
可以看出整个算法非常巧妙,避免了求排列的过程,整个算法的时间复杂度为O(nlogn).
具体的Java代码如下,写法比较通用,读者可以很容易的转化为其他语言实现:
public class Main { public static String[] zuheminmax(int a[]){ String b[]=new String[a.length]; for(int i=0;i<a.length;i++) //数值转换为字符串 b[i]=new String(a[i]+""); for(int i=0;i<b.length-1;i++) //按照自定义的规则排序 for(int j=i+1;j<b.length;j++) if(compare(b[i],b[j])) {String t=b[i]; b[i]=b[j]; b[j]=t; } String minmax[]=new String[2]; //用来存储排列数的最小值和最大值 minmax[0]=new String(""); minmax[1]=new String(""); for(int i=0;i<b.length;i++) //将所有的数连接起来,组成最小值 minmax[0]+=b[i]; for(int i=0;i<b.length;i++) //将所有的数连接起来,组成最大值 minmax[1]=b[i]+minmax[1]; return minmax; } public static boolean compare(String a,String b){ //自定义比较规则 String ab=a+b; String ba=b+a; if(ab.compareTo(ba)>0)return true; else return false; }public static void main(String[] args) {// TODO 自动生成的方法存根 int a[]={12,10,5,6,9}; String[] minmax=zuheminmax(a); System.out.println("最小值为:"+minmax[0]); System.out.println("最大值为:"+minmax[1]);}}
输出结果为:
最小值为:1012569
最大值为:9651210
- 求数组排列的范围
- 求数组的全排列
- 求数组的全排列
- 求数组的全部子集 && 全排列
- 转载整理:求数组的全排列
- 求一个数组的全排列算法
- 求字符数组的全排列算法
- 求字符数组的全排列
- 求一个数组的全排列
- 求数组排列
- 给定一个数组,求数组的全排列
- 求数组的全排列之字典序法
- 求数组全排列算法的递归实现
- 【C++】求数组中所有元素的排列或组合
- 求数组中任意n个数的全排列
- 求一个数组的全排列,所有组合
- 7622:求排列的逆序数 树状数组
- 求排列的个数
- JAVA中如何用shuffle打乱列表并生成乱序序列
- 解决QuartusII编译parameter "clk0_divide_by" is not a formal parameter of instantiated module的问题
- UI基础控件
- bootstrap, boosting, bagging 几种方法的联系
- 第10、11周项目4:教师兼干部类
- 求数组排列的范围
- zookeeper运维管理
- 【Scala】Vector内部结构与内存共享原理
- Given an N layers triangle in mathematic like the graph below
- poj2513 Colored Sticks (欧拉通路+Trie树+并查集)
- String StringBuilder StringBuffer 对比 总结得非常好
- HTML5 第八次作业
- Hibernate关联关系映射(单向篇)
- mysql 数据库学习笔记 3