题目地址:
https://www.lintcode.com/problem/1113/
给定一个长 n n n的字符串 s s s,其表示一个一元一次方程,求解之。题目保证解是整数。如果无解则返回“No solution”,如果无数解则返回“Infinite solutions”。
直接解析出等号两边表达式的 x x x的系数和常数项,然后解之即可。代码如下:
public class Solution {
/**
* @param equation: a string
* @return: return a string
*/
public String solveEquation(String equation) {
// write your code here
String[] s = equation.split("=");
// 解析出左右两边的x系数和常数项
int[] leftPair = parseExpression(s[0]), rightPair = parseExpression(s[1]);
int[] finalPair = new int[]{leftPair[0] - rightPair[0], leftPair[1] - rightPair[1]};
if (finalPair[0] == 0) {
return finalPair[1] == 0 ? "Infinite solutions" : "No solution";
}
return "x=" + (-(finalPair[1] / finalPair[0]));
}
// 返回x的系数和常数项
private int[] parseExpression(String expression) {
int coefficient = 0, constant = 0;
StringBuilder sb = new StringBuilder();
// 开头补个加号
if (!expression.startsWith("+") && !expression.startsWith("-")) {
expression = "+" + expression;
}
sb.append(expression.charAt(0));
for (int i = 1; i < expression.length(); i++) {
if (expression.charAt(i) != '+' && expression.charAt(i) != '-') {
sb.append(expression.charAt(i));
}
// 遇到了加减号,或者走到了最后一个字符,那么就解析一下当前项
if (expression.charAt(i) == '+' || expression.charAt(i) == '-' || i == expression.length() - 1) {
int[] pair = parseTerm(sb.toString());
coefficient += pair[0];
constant += pair[1];
sb = new StringBuilder(String.valueOf(expression.charAt(i)));
}
}
return new int[]{coefficient, constant};
}
// 解析出term所代表的项的x系数和常数
private int[] parseTerm(String term) {
int[] pair = new int[2];
if ("+x".equals(term) || "-x".equals(term)) {
pair[0] = term.charAt(0) == '+' ? 1 : -1;
pair[1] = 0;
return pair;
}
if (term.endsWith("x")) {
pair[0] = Integer.parseInt(term.substring(1, term.length() - 1));
if (term.startsWith("-")) {
pair[0] = -pair[0];
}
} else {
pair[1] = Integer.parseInt(term.substring(1));
if (term.startsWith("-")) {
pair[1] = -pair[1];
}
}
return pair;
}
}
时空复杂度 O ( n ) O(n) O(n)。