拼多多2021-7-25 笔试 第四题
题目描述:给定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(); } }