最近我遇到了一个面试问题。我被要求编写用于表达式评估的代码。表达式格式如下所示:
B=10;
A={
A=100;
B=BDE;
C=C;
D={
A=windows;
B=mac;
C={
A=redhat;
B=ubuntu;
};
};
A+={
A=200;
E=1000;
};
为了表示表达式的键,使用了句点分隔方法。例如,A.B表示映射A中的元素B,而A.B的值表示BDE;类似地,A.D.C.A的值是redhat。表示字符串称为“路径表达式”。
配置还支持append和override操作。对于上面的例子,我们使用+ =操作来追加或覆盖Map A中的值。现在A.A的值是200,而A.E的值是1000;
现在,给定配置字符串和配置的关键路径,我需要根据配置字符串返回配置值。
规则
1)密钥名称及其值仅包含字母(A-Z,a-z)和数字(0-9),不包含其他字符;
2)如果找不到值或表达式指向地图,请输出“N / A”
3)如果找到该值,请输出该值。输出值时没有空格。
输入和输出
输入有三个部分。第一行包含两个整数,表示连续行数(M)和表达式数(N)。
M <= 100,N <= 100。以下M行是混淆,后N行是表达式。每个配置行包含一个或多个配置。每行长度小于1000.
输入:
2 2
A = {A = 1; B = 2; C = 3; E = {A = 100;};};
A + = {d = 4; E = {B = 10; C = d;};};
A.E.B
B.D.E
输出
A.E.B = 10
B.D.E = N / A
我的想法
我在考虑使用N-nary树来表示表达式。例如,表达式:A = {A = 1; D = 1; B = {C = 1,D = {D = 1,F = 2};};};可以表示为:
(A,-)
/ | \
(A,1) (D,1) (B,-)
/ \
(C,1) (D,-)
/ \
(D,1) (F,2)
由于N-nary树可以表示为二叉树。因此,所有追加或搜索操作都可以是二叉树的插入或搜索操作。看来这种方法有效。但我想知道是否有更好的方法来解决这个问题?
答案 0 :(得分:0)
我正在考虑将所有孩子都放在哈希地图中(因为那是采访者喜欢的)
Node{
String val;
HashMap<String, Node> children;
Node(int val){
this.val = val;
children = new HashMap<String, Node>();
}
}