【发布时间】:2014-01-08 07:52:57
【问题描述】:
我最近参加了 Java 开发人员职位的面试。我被分配了一个任务:思考一种用 Java 表示电路(如下图所示电路)的好方法。
电路是逻辑门 XOR、AND、OR 等的组合。每个门都有两个输入端口和一个输出端口。每个输出都连接到另一个门的输入,该输入一直到更高的门(如图所示)。使系统简单,不允许循环(尽管现实生活中的电路可以有它们)。 我被要求考虑使用以下准则在 Java 中表示此模型的好方法:
- 我得到了一个电路和一个应该提供给其输入的值列表。
- 我需要创建一个模型来用 Java 表示电路,即,我需要定义可用于表示电路的类和 API。
- 根据输入值和门的连接方式,我需要计算所表示的电路会产生的输出。
- 我需要考虑一种方法来表示板,使用抽象类或接口,并展示对模型的理解(如果需要使用模式设计)。
我选择将系统设计为一棵树,面试官告诉我这是一个不错的选择。然后我构建这些类:
节点
public class gate_node {
gate_node right_c,left_c;
Oprtator op;
int value;
int right_v,left_v;
public gate_node(gate_node right,gate_node left,Oprtator op){
this.left_c=left;
this.right_c=right;
this.op=op;
right_v=left_v=0;
}
}
树
public class tree {
gate_node head;
tree(gate_node head) {
this.head = head;
}
void go_right() {
head = head.right_c;
}
void go_left() {
head = head.left_c;
}
static int arr[] = { 0, 0, 1, 0 };
static int counter=0;
static int compute(gate_node head) {
if ((head.left_c == null) && (head.right_c == null))
{
int ret=(head.op.calc(arr[counter], arr[counter+1]));
counter++;
counter++;
return ret;
}
return (head.op.calc(compute(head.left_c), compute(head.right_c)));
}
public static void main(String[] args) {
tree t = new tree(new gate_node(null, null, new and()));
t.head.left_c = new gate_node(null, null, new and());
t.head.right_c = new gate_node(null, null, new or());
System.out.println(tree.compute(t.head));
}
}
经营者类:
public abstract class Oprtator {
abstract int calc(int x, int y);
}
或门:
public class or extends Oprtator {
public int calc(int x, int y){
return (x|y);
}
}
在上面的代码中,我将板子实现为具有当前头部的树(可以向下到左/右子节点)。每个节点有 2 个子节点(也是节点类型)、2 个条目(0/1)、一个值和一个运算符(抽象类,可以通过 OR/AND.. 扩展)。
我使用了一个计数器和一个数组将值插入到树的适当叶子中(如代码中所述)。
它有效,但我仍然觉得我的面试官想要更多东西。我的代码是否正确?有没有人有更好的方式来表示这个电路板以及如何提供良好的输出(在复杂性或使用从一个类到另一个类的更好连接、设计模式等方面?)
【问题讨论】:
-
好吧,我会先花一些时间考虑输入表示,以及如何从文件中读取该表示。然后有几种不同的方法可以在内部构造数据并模拟操作。
-
(这是基于 38 年前在 FORTRAN 中实际完成的。)
-
他们可能一直在寻找模拟,而不是逻辑模型,涉及时序模型、侦听器(可能)等。
-
@EdStaub 时序模型需要未提供的输入,相当于组件数据表,而不仅仅是逻辑操作的名称。
-
我在阅读代码时最初的想法是,这家伙习惯于用 Java 以外的东西进行编程。类应该以大写字母开头,并且应该使用 camelCase 而不是下划线。加上您拼写错误的运算符,加上静态方法,所以不是特别面向对象。当有人从一种语言转换为另一种语言时,您总是会看到这样的代码。如果这份工作有很多竞争,那可能就足以错过。
标签: java algorithm design-patterns representation