360笔试题-修复方程

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < T; i++) {
            String equa = sc.next();
            boolean res = canMakeEquationTrue(equa);
            if (res) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
        sc.close();
    }

    private static boolean canMakeEquationTrue(String equa) {
        String[] parts = equa.split("=");
        String leftPart = parts[0];
        String rightPart = parts[1];

        long leftV = getValue(leftPart);
        long rightV = getValue(rightPart);

        if (leftV == rightV) {
            return true;
        } else if (leftV < rightV) {
            if (changeExpression(leftPart, rightV)) { // 只调整值更小的表达式
                return true;
            } else {
                return false;
            }
        } else {
            if (changeExpression(rightPart, leftV)) {
                return true;
            } else {
                return false;
            }
        }
    }

    // 判断是否能通过添加一位数,使得表达式值变为target
    private static boolean changeExpression(String expression, long target) {
        int l = 0, r = 0; // 记录一个数的左右边界
        for (int i = 0; i <= expression.length(); i++) {
            char ch = i < expression.length() ? expression.charAt(i) : ' ';
            if (ch >= '0' && ch <= '9') { // 数字
                r++;
            } else { // 操作符
                for (int j = l; j <= r; j++) {
                    for (int digit = 0; digit <= 9; digit++) {
                        if (j == 0 && digit == 0)
                            continue;
                        String newExpr = expression.substring(0, l) + expression.substring(l, j) + (char) ('0' + digit)
                                + expression.substring(j, r) + expression.substring(r);
                        if (getValue(newExpr) == target) {
                            return true;
                        }
                    }
                }
                r++;
                l = r;
            }
        }
        return false;
    }

    // 计算表达式的值
    private static long getValue(String expression) {
        String[] adds = expression.split("\\+");
        long result = 0L;
        for (String addStr : adds) {
            String[] muls = addStr.split("\\*");
            long temp = 1L;
            for (String mulStr : muls) {
                temp *= mulStr == "" ? 1L : Long.valueOf(mulStr);
            }
            result += temp;
        }
        return result;
    }
}

考试的时候没完全ac,这是后面自己整理的一版java解法,供各位家人们参考~也可以帮我验证检查看是否存在什么问题,欢迎大家评论指导。

#360笔试题##25秋招#
全部评论

相关推荐

01-14 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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