zoukankan      html  css  js  c++  java
  • 求数组排列的范围

    问题描述:给定一个整数数组,将这个整数数组排列成一个整数,并且数组的每个元素都要用到,求所排列出的整数的范围。

    分析:这是一个很有意思的题目,初看好像是要求所有排列情况的最小值和最大值,当然这样做也可以求出来,只不过时间复杂度过高,

            另外还有一个问题是大数问题,所排列成的数可能范围很大,超过了基本数据类型所能表示的范围,因此需要转换为字符串处理。

            下面详细介绍解法:

            解法一:用排列法。也就是求出这个数组的全排列,然后求出这个排列的最小值和最大值。由于排列要用到递归实现,

                       递归一般消耗系统大量的时间和空间,因此该方法效率略低。

            解法二:直接求出排列的最大值和最小值。先介绍一种方法,对于两个整数a和b,排列成一个整数后有两种结果ab和ba,

                        这里我们定义了一种新的大小规则,

                                 如果ab>ba,我们就认为a>b;

                                 如果ab=ba,我们就认为a=b;

                                 如果ab<ba,我们就认为a<b;

                       这不同于数学中的大小规则,为了解决大数问题,先将整数数组转化为字符串数组,在进行比较。具体算法如下:

                       第一步:将整数数组转换为字符串数组。

                       第二步:将这个字符串数组按照我们新定义的大小规则进行排序。

                       第三步:将排序后的数组串连成一个字符串,这个字符串就是所要求的最小值。

                       第四步:将第三步字符串逆序就是所要求的最大值。

                       可以看出整个算法非常巧妙,避免了求排列的过程,整个算法的时间复杂度为O(nlogn).

              具体的Java代码如下,写法比较通用,读者可以很容易的转化为其他语言实现:

     1 public class Main {
     2     public static String[] zuheminmax(int a[]){
     3         String b[]=new String[a.length];
     4         for(int i=0;i<a.length;i++)                       //数值转换为字符串
     5             b[i]=new String(a[i]+"");
     6         for(int i=0;i<b.length-1;i++)                     //按照自定义的规则排序
     7             for(int j=i+1;j<b.length;j++)
     8                 if(compare(b[i],b[j]))
     9                 {    String t=b[i];
    10                    b[i]=b[j];
    11                    b[j]=t;
    12                 }
    13         String minmax[]=new String[2];                     //用来存储排列数的最小值和最大值
    14         minmax[0]=new String("");
    15         minmax[1]=new String("");
    16         for(int i=0;i<b.length;i++)                       //将所有的数连接起来,组成最小值
    17             minmax[0]+=b[i];
    18         for(int i=0;i<b.length;i++)                       //将所有的数连接起来,组成最大值
    19             minmax[1]=b[i]+minmax[1];
    20         return minmax;
    21     }
    22     public static boolean compare(String a,String b){     //自定义比较规则
    23         String ab=a+b;
    24         String ba=b+a;
    25         if(ab.compareTo(ba)>0)return true;
    26         else return false;
    27     }
    28     public static void main(String[] args) {
    29         // TODO 自动生成的方法存根
    30        int a[]={12,10,5,6,9};
    31        String[] minmax=zuheminmax(a);
    32        System.out.println("最小值为:"+minmax[0]);
    33        System.out.println("最大值为:"+minmax[1]);
    34     }
    35 }

    输出结果为:

    最小值为:1012569
    最大值为:9651210

                        

  • 相关阅读:
    webpack学习1-打包
    Cordova开发-2 自定义插件
    Vue项目开发1-项目的创建
    Cordova开发-2 具体插件的使用
    Cordova开发-1 项目的创建
    Mybatis的使用
    XAMPP设置上的问题
    七款Debug工具推荐:iOS
    sqlite内置函数
    CATransition常用动画及type
  • 原文地址:https://www.cnblogs.com/guozhenqiang/p/5483476.html
Copyright © 2011-2022 走看看