题目描述:给定0-9组成的任意数字字符串 其数字可重复 通过该字符串插入乘号(不限数量) 使得得到的乘法结果最大
思路:贪心构造两个最大最接近的乘数
ps:乘号插入后的结果一定小于原数,所以只插一个乘号即可,被迫至少插一个,插多的话会变小
证明:
abcde=abc x 100 + de
abc x de <=abc x 99
前者大于后者,乘号放哪都一样满足这个

import java.math.BigInteger;
import java.util.Scanner;
//拼多多 2021-7-25 笔试 第四题
//题目描述:给定0-9组成的任意数字字符串 其数字可重复 通过该字符串插入乘号(不限数量) 使得得到的乘法结果最大
public class Solution1 {
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        //接收0-9每种数字的数量
        int[] input=new int[10];
        for (int i = 0; i < 10; i++) {
            input[i]=s.nextInt();
        }
        //根据数量,从0-9的去取数字构造字符串,这里取完了就排序好了
        StringBuilder input_s= new StringBuilder();
        for (int i = 0; i < 10; i++) {
            if(input[i]>0){
                for (int j = 1; j <=input[i] ; j++) {
                    input_s.append(""+i);
                }
            }
        }
        //System.out.println(input_s);
        System.out.println(fun(input_s.toString()));
        //System.out.println(new BigInteger(97632+"").multiply(new BigInteger("87541")));
    }
    //从输入的数堆中尝试构造两个最大最接近的数   每次取两个最大的数,想办法接到乘数1,和乘数2上,使它们最接近
    static public String fun(String input_s) {
        //开一个方向标记
        int mark = 1;
        int i = input_s.length() - 1;
        String mutiy1 = "", mutiy2 = "";
        //尝试取数构造
        while (i >=0) {
            //每次追加交换方向  比如上次是先给乘数1追加,这次就先给乘数2追加,这样,乘数1和2才始终最接近
            if(i>=1) {
                if (mark == 1) {
                    mutiy1 += input_s.charAt(i);
                    i--;
                    mutiy2 += input_s.charAt(i);
                    i--;
                    mark = 2;
                }
                else {
                    mutiy2 += input_s.charAt(i);
                    i--;
                    mutiy1 += input_s.charAt(i);
                    i--;
                    mark = 1;
                }
            }
            //如果最后单独剩余一个数,分别追加到乘数1或2上,返回大的乘法结果值
            if (i == 0) {
                BigInteger res1 = new BigInteger(mutiy1 + input_s.charAt(0)).multiply(new BigInteger(mutiy2));
                BigInteger res2 = new BigInteger(mutiy1).multiply(new BigInteger(mutiy2 + input_s.charAt(0)));
                if (res1.compareTo(res2) < 0) {
                    return res2.toString();
                } else {
                    return res1.toString();
                }
            }
        }
        BigInteger res = new BigInteger(mutiy1).multiply(new BigInteger(mutiy2));
        return res.toString();
    }
}