我接受过编程采访,其中包括3名采访者,每人45分钟。 虽然前两位采访者给了我2-3个简短的编码问题(即反向链接列表,使用rand(5)实现rand(7)等)第三位采访者使用整个时间段进行单一问题:
您将获得正确形成并带括号的字符串 布尔表达式,由字符T,F,&,|,!,(,)组成 空间。 T代表True,F代表False,&对于逻辑AND,|对于 逻辑或,!否定。 &安培;优先于|。任何这些 chars之后是输入字符串中的空格。我是要评估价值 表达式并打印它(输出应为T或F)。示例:输入: ! (T | F& F)输出:F
我尝试实现Shunting Yard算法的变体来解决问题(以后缀形式转换输入,然后评估后缀表达式),但未能在给定的时间范围内正确编码,所以我最终解释了伪代码和我想要的话。
我的招聘人员说,前两位面试官给了我“HIRE”,而第三位面试官给了我“NO HIRE”,由于最终决定是“合乎逻辑的”,他感谢我的时间。
我的问题: 你认为这个问题适合大约在白板上的代码。 40分钟?对我来说,似乎很多代码都是为了这么短的时间段和白板的尺寸。 是否有比使用调车码算法更短的方法来解决这个问题?
答案 0 :(得分:2)
Infix到postfix也很简单。话虽如此,如果您不了解算法,我认为这不是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();
}
在你的情况下使它工作(使用那个片段)你首先必须解析表达式并用像字母一样简单的东西替换像“!”,“|”,“^”等特殊字符或只使用整数字符在if情况下的价值。