m**********w 发帖数: 60 | 1 电面:
解一个简单的一元一次方程,
比如: 5 + x - 1 = x - 1 + x, 输出 x=5.
开始只考虑 +, - 的情况,
然后问如果有x,/ 和括号 怎么做。 |
h*******e 发帖数: 1377 | 2 感觉把 x 和 5 1 变成 size 为2的 vector 表示 ax + b vec[0] = a vec[1] = b,
然后算作左边得到一个最简的 size为2的vector,再算右边, 然后最后 结果是 1位
相减 / 0位相减 的相反数。 |
c*******y 发帖数: 98 | 3 + - 扩展成 + - * /, 再扩展成 带()的,我觉得直到+ - * /好像还好对付一点,
maintain一个系数list,然后iterative的弄掉符号
1 - 4行先做* / 再做 + -
2*x/3*5+x*3/5+4 = 2+x*3+0 [0][0] [0][0]
2x/3*5+3x/5+4 = 2+3x+0 [0][0] [0][0]
1.5x+0.6x+4 = 2+3x+0 [0][0] [0][0]
2.1x+4 = 2+3x+0 [2.1][4] [0][0] 直到某边只有x项和常数项,加入
list
这一步整理x到前边,常数到后边
2.1x+4 = 3x+2+0 [2.1][4] [0][0]
重复1 - 4的步骤(函数)
2.1x+4 = 3x+2 [2.1][4] [3][2] 直到某边只有x项和常数项,加入
list
最后算x,如果输入合理,应该能算出来。当然最好验证一下/0之类的case。
x = (v2[1]-v1[1])/(v1[0]-v2[0]);
带括号的,我觉得以上边步骤为子函数,对最里面的括号内的东西先做,变成ax+b,然
后去掉括号,反复重复这个步骤,应该会得到最终的ax+b = cx+d的形式。不过我只会
iterative,每次都重新process新的equation,应该有大神可以用recursive直接十几
行代码就搞定的。。 |
l*********u 发帖数: 19053 | 4 先搞成ax+b=cx+d,再扫一遍,算a,b,c,d。先括号,再*/,再+-
【在 m**********w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 电面: : 解一个简单的一元一次方程, : 比如: 5 + x - 1 = x - 1 + x, 输出 x=5. : 开始只考虑 +, - 的情况, : 然后问如果有x,/ 和括号 怎么做。
|
o*****o 发帖数: 10 | 5 假设你有一个多项式对象,包装了多项式的加减乘除,那么用这个多项式对象代替int
,就可以像做“实现一个计算器”这种题目一样处理等式左右两边的式子。这样应该能
够处理相当复杂的情况(比如有高次项但最后被抵消x*x*x+x+1-x*x*x=0)。
需要额外实现的就是这个多项式对象,以及多项式的加减乘除。多项式除比较难做,可
以保留分子分母,最后一步左右互乘对面的分母简化掉。
不知道是不是有点overkill了。
【在 m**********w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 电面: : 解一个简单的一元一次方程, : 比如: 5 + x - 1 = x - 1 + x, 输出 x=5. : 开始只考虑 +, - 的情况, : 然后问如果有x,/ 和括号 怎么做。
|
m**********w 发帖数: 60 | 6 电面:
解一个简单的一元一次方程,
比如: 5 + x - 1 = x - 1 + x, 输出 x=5.
开始只考虑 +, - 的情况,
然后问如果有x,/ 和括号 怎么做。 |
h*******e 发帖数: 1377 | 7 感觉把 x 和 5 1 变成 size 为2的 vector 表示 ax + b vec[0] = a vec[1] = b,
然后算作左边得到一个最简的 size为2的vector,再算右边, 然后最后 结果是 1位
相减 / 0位相减 的相反数。 |
c*******y 发帖数: 98 | 8 + - 扩展成 + - * /, 再扩展成 带()的,我觉得直到+ - * /好像还好对付一点,
maintain一个系数list,然后iterative的弄掉符号
1 - 4行先做* / 再做 + -
2*x/3*5+x*3/5+4 = 2+x*3+0 [0][0] [0][0]
2x/3*5+3x/5+4 = 2+3x+0 [0][0] [0][0]
1.5x+0.6x+4 = 2+3x+0 [0][0] [0][0]
2.1x+4 = 2+3x+0 [2.1][4] [0][0] 直到某边只有x项和常数项,加入
list
这一步整理x到前边,常数到后边
2.1x+4 = 3x+2+0 [2.1][4] [0][0]
重复1 - 4的步骤(函数)
2.1x+4 = 3x+2 [2.1][4] [3][2] 直到某边只有x项和常数项,加入
list
最后算x,如果输入合理,应该能算出来。当然最好验证一下/0之类的case。
x = (v2[1]-v1[1])/(v1[0]-v2[0]);
带括号的,我觉得以上边步骤为子函数,对最里面的括号内的东西先做,变成ax+b,然
后去掉括号,反复重复这个步骤,应该会得到最终的ax+b = cx+d的形式。不过我只会
iterative,每次都重新process新的equation,应该有大神可以用recursive直接十几
行代码就搞定的。。 |
l*********u 发帖数: 19053 | 9 先搞成ax+b=cx+d,再扫一遍,算a,b,c,d。先括号,再*/,再+-
【在 m**********w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 电面: : 解一个简单的一元一次方程, : 比如: 5 + x - 1 = x - 1 + x, 输出 x=5. : 开始只考虑 +, - 的情况, : 然后问如果有x,/ 和括号 怎么做。
|
o*****o 发帖数: 10 | 10 假设你有一个多项式对象,包装了多项式的加减乘除,那么用这个多项式对象代替int
,就可以像做“实现一个计算器”这种题目一样处理等式左右两边的式子。这样应该能
够处理相当复杂的情况(比如有高次项但最后被抵消x*x*x+x+1-x*x*x=0)。
需要额外实现的就是这个多项式对象,以及多项式的加减乘除。多项式除比较难做,可
以保留分子分母,最后一步左右互乘对面的分母简化掉。
不知道是不是有点overkill了。
【在 m**********w 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 电面: : 解一个简单的一元一次方程, : 比如: 5 + x - 1 = x - 1 + x, 输出 x=5. : 开始只考虑 +, - 的情况, : 然后问如果有x,/ 和括号 怎么做。
|
f**********t 发帖数: 1001 | 11 int opNum(int x, int y, char op) {
switch (op) {
case '+':
return x + y;
case '_':
return x - y;
case '*':
return x * y;
case '/':
if (y == 0) {
return 0;
}
return x / y;
}
return 0;
}
int calc(stack &ops, stack &nums) {
int x = nums.top();
nums.pop();
int y = nums.top();
nums.pop();
int res = opNum(x, y, ops.top());
ops.pop();
nums.push(res);
return res;
}
string simplify(string s) {
auto it = s.begin();
stack ops;
stack nums;
int coefficient = 0;
bool inLeft = true;
while (1) {
while (it != s.end() && isspace(*it)) {
++it;
}
if (it == s.end()) {
break;
}
if (*it == '+' || *it == '-') {
ops.push(*it);
++it;
} else if (*it == '=') {
while (!ops.empty()) {
calc(ops, nums);
}
inLeft = false;
ops.push('+');
++it;
} else {
int num = 0;
while (it != s.end() && isdigit(*it)) {
num = num * 10 + (*it - '0');
++it;
}
if (ops.size() == 1 && nums.empty() &&
(it == s.end() || *it != 'x')) {
if (ops.top() == '-') {
num = -num;
}
ops.pop();
}
if (!inLeft) {
num = -num;
}
if (it == s.end()) {
nums.push(num);
break;
}
if (*it == 'x') {
num = num == 0 ? (inLeft ? 1 : -1) : num;
if (ops.empty()) {
coefficient += num;
} else {
if (ops.top() == '+') {
coefficient += num;
} else if (ops.top() == '-') {
coefficient -= num;
}
ops.pop();
}
++it;
} else {
nums.push(num);
}
}
}
while (!ops.empty()) {
calc(ops, nums);
}
return to_string(coefficient) + "x" + " = " + to_string(-nums.top());
} |
w****k 发帖数: 755 | 12 其实按符号截断后hash就行了,你知道多少个x,多少个5,等等。 |