设有n个正整数,将他们连接成一排,组成一个最大的多位整数

设有n个正整数,将他们连接成一排,组成一个最大的多位整数。

如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。

当时看到这个的第一反应是要去从左到右比较每个数最高位的大小,
然后我的脑回路走到了去获取每个数的最高位去了,小弟拙见,在此抛砖引玉

public static int[] test(long []a,int n) {

        int[] count=new int[n];//传入一个数组,长度
        int[] length=new int[n];//获取每个整数的长度
        for(int i=0;i//返回最高位
            length[i]=String.valueOf(a[i]).length();
            count[i]=(int) (a[i]/Math.pow(10,length[i]-1));//
    }
        return count;
    }

以上写的是一个获取最高位的函数(稍作修改也可以获取最高前k位),如果最高位相同获取最高前两位去比较,然后重点跑到了比较

就要找到最高位相同的角标,再去比较数组里这几个数的最高前两位,如果还相同就继续比较以此类推,想了很久感觉很麻烦,总之就是我没实现(蓝瘦香菇,还想了字符串的模式匹配啥的bala的)

虽然在上边获取整数的位数时使用了将整数转化成字符串去获取长度但是还是没有为这个题get到关键点

将整数转换成字符串进行拼接,a+b和b+a之后转化成整数比较这两个数的大小问题,数组中的两两进行比较,后者大说明需要交换顺序,核心就是这个:

public static int compare(long num1,long num2){
        String str1 = num1 + "";
        String str2 = num2 + "";
        int temp1 = Integer.parseInt(str1+str2);
        int temp2 = Integer.parseInt(str2+str1);

        return temp1 - temp2;
        }

总体代码如下:

import java.util.Scanner;
public class Main {
    public static int compare(long num1,long num2){
        String str1 = num1 + "";
        String str2 = num2 + "";
        int temp1 = Integer.parseInt(str1+str2);
        int temp2 = Integer.parseInt(str2+str1);

        return temp1 - temp2;
        }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        int n= sc.nextInt(); //输入n个整数
        long []a=new long[n];
        long temp=0;

        for(int j=0;jfor(int x=0;xfor(int y=x+1;yif(compare(a[x],a[y])<0)//判断条件是两个数拼接的两种情况的差
                {
                  temp=a[x];
                  a[x]=a[y];
                  a[y]=temp;
                }
            }
        for(int i = 0; i < n; i++){
            System.out.print(a[i]);
            }
    }
}

排序也可以选择其他排序算法,但是Mark一下把整数转换成字符串的操作,使程序简洁了很多,也少饶了路。—–小弟拙见,请大家指教!

你可能感兴趣的:(编程题,算法)