leetcode 399. Evaluate Division

题目:

Equations are given in the format A / B = k, where A and B are variables represented as strings, and k is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0.

Example:
Given a / b = 2.0, b / c = 3.0. 
queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? . 
return [6.0, 0.5, -1.0, 1.0, -1.0 ].

The input is: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries , where equations.size() == values.size(), and the values are positive. This represents the equations. Return vector<double>.

According to the example above:

equations = [ ["a", "b"], ["b", "c"] ],
values = [2.0, 3.0],
queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]. 

 

The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction.

 

 1 import java.util.*;
 2 
 3 public class Solution {
 4     public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
 5         Map<String,Map<String,Double>> eqmap = new HashMap<String, Map<String, Double>>();
 6         double[] result = new double[queries.length];
 7         for(int i=0;i<equations.length;i++){
 8             Map<String,Double> temp = new HashMap<String, Double>();
 9             if(eqmap.containsKey(equations[i][0]))
10                 eqmap.get(equations[i][0]).put(equations[i][1],values[i]);
11             else{
12                 temp.put(equations[i][1],values[i]);
13                 eqmap.put(equations[i][0],temp);
14             }
15             if(eqmap.containsKey(equations[i][1]))
16                 eqmap.get(equations[i][1]).put(equations[i][0],1/values[i]);
17             else{
18                 temp = new HashMap<String, Double>();
19                 temp.put(equations[i][0],1/values[i]);
20                 eqmap.put(equations[i][1],temp);
21             }
22         }
23         for(int j=0;j<queries.length;j++){
24             Stack<String> strK = new Stack<String>();
25             Set<String> strS = new HashSet<String>();
26             result[j] = getResult(eqmap,queries[j],strK,strS);
27         }
28         return result;
29     }
30     private double getResult(Map<String,Map<String,Double>> eqmap, String[] query, Stack<String> strK,Set<String> strS){
31         if(eqmap.containsKey(query[0])&&eqmap.containsKey(query[1])){
32             Map<String, Double> tempmap = eqmap.get(query[0]);
33             if (tempmap.containsKey(query[1])) {
34                 return tempmap.get(query[1]);
35             }
36             else{
37                 Iterator ite = eqmap.get(query[0]).entrySet().iterator();
38                 while(ite.hasNext()){
39                     Map.Entry ent = (Map.Entry)ite.next();
40                     if(!strS.add((String)ent.getKey()))
41                         continue;
42                     strK.push(query[0]);
43                     double result = (Double) ent.getValue() * getResult(eqmap,new String[]{(String) ent.getKey(),query[1]},strK,strS);
44                     if(result>0)
45                         return result;
46                     else strK.pop();
47                 }
48             }
49         }
50         return -1.0;
51     }
52 }

 

posted @ 2016-09-19 14:01  HelloWorld_5  阅读(210)  评论(0编辑  收藏  举报