leetcode-求解方程
程序员文章站
2022-03-10 23:13:08
https://leetcode cn.com/problems/solve the equation/description/ ......
/** * Created by feichen on 2018/6/17. * <p> * <p> * 求解一个给定的方程,将x以字符串"x=#value"的形式返回。该方程仅包含'+',' - '操作,变量 x 和其对应系数。 * <p> * 如果方程没有解,请返回“No solution”。 * <p> * 如果方程有无限解,则返回“Infinite solutions”。 * <p> * 如果方程中只有一个解,要保证返回值 x 是一个整数。 * <p> * 示例 1: * <p> * 输入: "x+5-3+x=6+x-2" * 输出: "x=2" * 示例 2: * <p> * 输入: "x=x" * 输出: "Infinite solutions" * 示例 3: * <p> * 输入: "2x=x" * 输出: "x=0" * 示例 4: * <p> * 输入: "2x+3x-6x=x+2" * 输出: "x=-1" * 示例 5: * <p> * 输入: "x=x+2" * 输出: "No solution" */ public class SolveEquation { /** * 方程没有解 */ private static final String NO_SOLUTIONS = "No solution"; /** * 方程有无限解 */ private static final String INFINITE_SOLUTIONS = "Infinite solutions"; class EquationSide { /** * 有几个x */ private int countX; /** * 常数 */ private int constantNo; public int getCountX() { return countX; } public void setCountX(int countX) { this.countX = countX; } public int getConstantNo() { return constantNo; } public void setConstantNo(int constantNo) { this.constantNo = constantNo; } @Override public String toString() { return "EquationSide{" + "countX=" + countX + ", constantNo=" + constantNo + '}'; } } /** * 转换 * * @param equation * @return */ private EquationSide convert(String equation) { String[] strings = equation.split("="); EquationSide finalEquation = new EquationSide(); if (strings.length != 2) { return finalEquation; } String left = strings[0]; String right = strings[1]; EquationSide leftEquation = convertString(left); EquationSide rightEquation = convertString(right); finalEquation.setCountX(leftEquation.getCountX() - rightEquation.getCountX()); finalEquation.setConstantNo(leftEquation.getConstantNo() - rightEquation.getConstantNo()); return finalEquation; } /** * @param s * @return */ private EquationSide convertString(String s) { EquationSide equationSide = new EquationSide(); if (s.length() == 1) { if (s.equals("x")) { equationSide.setCountX(1); } else { equationSide.setConstantNo(Integer.valueOf(s)); } return equationSide; } char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; ) { if (i == chars.length - 1) { break; } for (int j = i + 1; j < chars.length; j++) { if (j == chars.length - 1) { if (chars[j] == 'x') { if (j >= 1 && chars[j - 1] != '+' && chars[j - 1] != '-') { equationSide.countX += Integer.valueOf(s.substring(i, j)); } else if (j >= 1 && chars[j - 1] == '+') { equationSide.countX++; } else if (j >= 1 && chars[j - 1] == '-') { equationSide.countX--; } } else { equationSide.constantNo += Integer.valueOf(s.substring(i)); } i = j; break; } if (chars[j] == '+' || chars[j] == '-') { if (chars[j - 1] == 'x') { if (j >= 2 && chars[j - 2] != '+' && chars[j - 2] != '-') { equationSide.countX += Integer.valueOf(s.substring(i, j - 1)); } else if (j >= 2 && chars[j - 2] == '-') { equationSide.countX--; } else { equationSide.countX++; } } else { equationSide.constantNo += Integer.valueOf(s.substring(i, j)); } i = j; break; } } } return equationSide; } public String solveEquation(String equation) { EquationSide finalResult = convert(equation); if (finalResult.getCountX() == 0 && finalResult.getConstantNo() == 0) { return INFINITE_SOLUTIONS; } else if (finalResult.getCountX() == 0 && finalResult.getConstantNo() != 0) { return NO_SOLUTIONS; } else if (finalResult.getCountX() != 0 && finalResult.getConstantNo() == 0) { return "x=0"; } else { return "x=" + -(finalResult.getConstantNo() / finalResult.getCountX()); } } public static void main(String[] args) { SolveEquation solveEquation = new SolveEquation(); System.out.println(solveEquation.solveEquation("x=x+2")); } }