2014-01-16 64 views
1

最近我遇到一個面試問題。我被要求編寫表達式評估代碼。表達式格式如下所示:如何解析某種類型的配置文件

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。表示字符串被稱爲「路徑表達式」。

該配置還支持追加和覆蓋操作。對於上面的例子,我們使用+ =操作來附加或覆蓋地圖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

輸入:

A = {A = 1; B = 2; C = 3; E = {A = 100;};} ; A = {D = 4; E = {B = 10; C = D;};};};

AEB

BDE

輸出

AEB = 10

BDE = N/A

我的想法

我想使用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-tree樹可以表示爲二叉樹。因此,所有附加或搜索操作都將是二叉樹的插入或搜索操作。看來這種方法是有效的。但我想知道是否有更好的方法來解決這個問題?

回答

0

我的想法把所有的孩子在一個哈希表(因爲這就是面試等)

Node{ 
    String val; 
    HashMap<String, Node> children; 
    Node(int val){ 
     this.val = val; 
     children = new HashMap<String, Node>(); 
    } 
} 
+0

謝謝你的評論。我認爲這種方法是行不通的,因爲即使你把所有的孩子都放在散列圖中,你仍然很難找到對應的鍵值。例如,A = {A = {A = B};};在這種情況下,如果我們想要找到A [A] [A]的價值呢? –

+0

假設第一個節點被聲明爲節點,您將執行node.children.get('A')。children.get('A').val – Meow