拼多多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();
    }
}
全部评论
大佬,能请教一下你ps中的那个理论是为什么嘛? “乘号插入后的结果一定小于原数,所以只插一个乘号即可,被迫至少插一个,插多的话会变小”
点赞 回复 分享
发布于 2021-07-28 00:50
大佬,好强,贪心回溯这些都看不懂😭😭
点赞 回复 分享
发布于 2021-07-26 10:02

相关推荐

我:“加班需要有加班工资。”&nbsp;hr:“为什么?”&nbsp;哈哈哈哈哈哈哈离大谱
juntenor:你确实太理想化了,对社会不了解呀。这个和HR没有关系,这是国内特色,不然怎么还会有外包就这种逆天的存在呢。
点赞 评论 收藏
分享
见见123:简历没有啥问题,是这个社会有问题。因为你刚毕业,没有工作经历,现在企业都不要没有工作经历的。社会病了。
点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
实习与准备秋招该如何平衡
点赞 评论 收藏
分享
评论
7
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务