【问题标题】:Algorithm to evaluate value of Boolean expression评估布尔表达式值的算法
【发布时间】:2013-05-26 17:53:09
【问题描述】:

我参加了由 3 名面试官组成的编程面试,每人 45 分钟。 虽然前两位面试官给了我 2-3 个简短的编码问题(即反向链表、使用 rand(5) 实现 rand(7) 等),但第三位面试官使用了整个时间段来回答单个问题:

你得到代表正确格式和括号的字符串 由字符 T、F、&、|、!、(, ) 组成的布尔表达式 空格。 T 代表 True,F 代表 False,& 代表逻辑与,|为了 逻辑或,!为否定。 & 的优先级高于 |。这些中的任何一个 chars 后跟输入字符串中的空格。我要评估价值 表达式并打印它(输出应该是 T 或 F)。示例:输入: ! ( T | F & F ) 输出:F

我尝试实现 Shutting Yard 算法的变体来解决问题(将输入转换为后缀形式,然后评估后缀表达式),但未能在给定的时间范围内正确编码,所以我最终用伪代码和说出我想要的。

我的招聘人员说前两个面试官给了我“HIRE”,而第三个面试官给了我“NO HIRE”,由于最终决定是“逻辑与”,他感谢我的时间。

我的问题: 你认为这个问题是否适合在白板上编写代码? 40分钟?对我来说,如此短的时间段和白板尺寸似乎有很多代码。 有没有比使用分流场算法更短的方法来解决这个问题?

【问题讨论】:

    标签: boolean expression evaluate


    【解决方案1】:

    好吧,一旦你对解析器有了一些经验,后缀算法就很简单了。 1. 从左到右评估每个字符: 如果它的操作数,则压入堆栈。 如果它的操作符,弹出 A,然后弹出 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();
    }
    

    在您的情况下,要使其正常工作(使用该 sn-p),您首先必须解析表达式并将“!”,“|”,“^”等特殊字符替换为诸如字母之类的普通字符,或者只使用if 情况下的整数 char 值。

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2021-07-11
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多