Nik*_*vic 6 expression boolean evaluate
我参加了编程面试,由 3 名面试官组成,每人 45 分钟。虽然前两位面试官给了我 2-3 个简短的编码问题(即反向链表、使用 rand(5) 实现 rand(7) 等),但第三位面试官使用了整个时间段来回答单个问题:
您将得到表示正确形成且带括号的布尔表达式的字符串,该表达式由字符 T、F、&、|、!、(、) 和空格组成。T 代表 True,F 代表 False,& 代表逻辑 AND,| 对于逻辑或,! 为否定。& 的优先级高于 |。在输入字符串中,这些字符中的任何一个都后跟一个空格。我要计算表达式的值并打印它(输出应该是 T 或 F)。示例: 输入: ! ( T | F & F ) 输出:F
我尝试实现调车场算法的变体来解决问题(将输入转换为后缀形式,然后计算后缀表达式),但未能在给定的时间范围内正确编码,所以我最终用伪代码和文字解释了我的意思通缉。
我的招聘人员说前两位面试官给了我“聘用”,而第三位面试官给了我“不聘用”,由于最终的决定是“逻辑与”,他感谢我抽出时间。
我的问题:您认为这个问题适合在白板上编写大约 10 分钟的代码吗?40分钟?对我来说,对于如此短的时间段和白板尺寸来说,代码似乎太多了。对于这个问题,是否有比使用调车场算法更短的方法?
小智 3
好吧,一旦您有了一些解析器的经验,后缀算法就非常简单了。1. 从左到右计算每个字符:如果是操作数,则压入堆栈。如果它的操作符,pop A,然后pop B,然后将B操作数A压入堆栈。堆栈中的最后一项将是结果。如果没有或不止一个,则意味着您做错了(假设后缀表示法有效)。
中缀到后缀也很简单。话虽如此,如果您不了解算法,我认为 40 分钟的任务并不合适。这是我在某个阶段编写的布尔后缀评估方法(也使用 Lambda):
public static boolean evaluateBool(String s)
{
Stack<Object> stack = new Stack<>();
StringBuilder expression =new StringBuilder(s);
expression.chars().forEach(ch->
{
if(ch=='0') stack.push(false);
else if(ch=='1') stack.push(true);
else if(ch=='A'||ch=='R'||ch=='X')
{
boolean op1 = (boolean) stack.pop();
boolean op2 = (boolean) stack.pop();
switch(ch)
{
case 'A' : stack.push(op2&&op1); break;
case 'R' : stack.push(op2||op1); break;
case 'X' : stack.push(op2^op1); break;
}//endSwitch
}else
if(ch=='N')
{
boolean op1 = (boolean) stack.pop();
stack.push(!op1);
}//endIF
});
return (boolean) stack.pop();
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,要使其正常工作(使用该片段),您首先必须解析表达式并将特殊字符(如“!”、“|”、“^”等)替换为简单的字母之类的字符,或者仅在您的代码中使用整数字符值如果情况
| 归档时间: |
|
| 查看次数: |
4407 次 |
| 最近记录: |