当前位置: 移动技术网 > IT编程>开发语言>Java > leetcode-求解方程

leetcode-求解方程

2018年06月19日  | 移动技术网IT编程  | 我要评论

枞阳县人民医院,3个月的宝宝,令路线

/**
 * 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"));

    }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网