滴滴的算式翻转题

首先,只有两种操作符存在可以交换操作数的情况:+ 和 *,思路就是把连续的*所连接的操作数进行排序,把连续的+所连接的操作数进行排序。
但+ 有一个受限条件:连续的加号被非减号的操作符(*和/)断开,需要少排序一个数,比如 9 + 6 + 3 / 2,只能对9和6进行排序,不能动那个3;
开始编码:
 //main函数,处理输入,用空格把输入拆分成字符串数字,调用解题函数并输出结果
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        in.nextLine();
        String[] factors = in.nextLine().trim().split(" ");
        solve(factors);
        if (factors.length > 0) {
            System.out.print(factors[0]);
            for (int i = 1; i < factors.length; i++) {
                System.out.print(" " + factors[i]);
            }
        }
        System.out.println(" ");
    }

    //解题函数,先处理乘号,再处理加号,时间复杂度O(2n) = O(n)
    //可以优化为只遍历一趟
    private static void solve(String[] factors) {
        solveOperator(factors, "*");
        solveOperator(factors, "+");
    }

    //对单个操作符进行处理
    private static void solveOperator(String[] factors, String operator) {
        int index = 0;
        while (index < factors.length) {
            //找到第一个对应的操作符
            while (index < factors.length && !factors[index].equals(operator)) {
                index++;
            }
            //用来记录和排序操作数
            List<Integer> operands = new ArrayList<>();
            //向operands列表添加连续的operator所连接的操作数
            while (index < factors.length && factors[index].equals(operator)) {
                operands.add(Integer.parseInt(factors[index - 1]));
                index += 2;
            }
            
            //index用于遍历,pointer用于对排序后的结果进行回填
            int pointer;
            // + 的受限条件下,少排序一个数字
            if (operator.equals("+") && index < factors.length && !factors[index].equals("-")) {
                pointer = index - 1;
            } else {
                operands.add(Integer.parseInt(factors[index - 1]));
                pointer = index + 1;
            }
            //排序
            Collections.sort(operands);
            //将排序后的操作数进行回填
            for (int i = 0; i < operands.size(); i++) {
                factors[pointer - (operands.size() * 2 - i * 2)] = operands.get(i).toString();
            }
        }
    }

根据下面大家评论发现,少考虑了连减和连除等情况,只过了18%,就不冤了😂
#滴滴##笔试题目##秋招##题解#
全部评论
兄嘚啊,naive啊,我 6 - 8 - 9 - 7 的789就不用换了吗?
点赞 回复 分享
发布于 2019-08-27 21:14
连续的除和减就不管了么。。
点赞 回复 分享
发布于 2019-08-27 21:12
一样的做法只a了9
点赞 回复 分享
发布于 2019-08-27 21:09
*为什么不能动3
点赞 回复 分享
发布于 2019-08-27 21:11
连减连除也可以交换啊 7 - 4 - 3 - 2 = 7 - 2 - 3 - 4,16 / 4 / 2 = 16 / 2 / 4  表示一直懵逼,ac 0道
点赞 回复 分享
发布于 2019-08-27 21:12
除和减第一个数不能动,没考虑到,阿西吧
点赞 回复 分享
发布于 2019-08-27 21:14
不对把,-号和/号也可以交换把,只要满足左右两侧的值相等就可以交换左右两侧啊
点赞 回复 分享
发布于 2019-08-27 21:14
除法也可以啊 6/6/1   6/1/6
点赞 回复 分享
发布于 2019-08-27 21:15
一样的想法,同过18%,哭了
点赞 回复 分享
发布于 2019-08-27 21:17
为什么上面都考虑了最后45,本地样例都过了。。。。
点赞 回复 分享
发布于 2019-08-27 21:17
🤣 我的思路是左边大于右边就尝试交换两个值,如果计算结果相同则交换成功,不同则把数字换回来。 遍历数组重复以上操作直到某次遍历没有数字被交换 18,答案错误
点赞 回复 分享
发布于 2019-08-27 21:18
三个连续的-或者连续的/都可以啊,太难了
点赞 回复 分享
发布于 2019-08-27 21:19
和你一样 估计是意思错了 貌似全排列来做
点赞 回复 分享
发布于 2019-08-27 21:20
连减和连除也可以交换吧,只不过连除第一位不能动,连减第一位要看符号,边界情况有点多
点赞 回复 分享
发布于 2019-08-27 21:21
四个符号都是可以翻转的,不过翻转的区间因条件而异,可以看看我最新的帖子~
点赞 回复 分享
发布于 2019-08-27 21:21
你ac了吗?这个思路应该不行我开始也是这么想的,应该需要把表达的值算出来,排序+表达式求值,而且冒泡之类排序应该会超时,可能希尔,快排勉强能卡过去,这题挺难的,劝退题,太复杂了而且时间也不够,就一小时四十分钟还带选择题
点赞 回复 分享
发布于 2019-08-27 23:19

相关推荐

牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
点赞 8 评论
分享
牛客网
牛客企业服务