题解 | #牛群之间的体重比#
牛群之间的体重比
https://www.nowcoder.com/practice/75717e3241704b55a71ecc6bdbf6b9b4?tpId=354&tqId=10594508&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weightRatios string字符串二维数组 * @param ratioValues double浮点型一维数组 * @param questions string字符串二维数组 * @return double浮点型一维数组 */ public double[] calcWeightRatios (String[][] weightRatios, double[] ratioValues, String[][] questions) { // write code here double[] res = new double[questions.length]; HashMap<String, String> stringMap = new HashMap<>(); HashMap<String, Double> map = new HashMap<>(); for (int i = 0; i < weightRatios.length; i++) { String c1 = weightRatios[i][0]; String c2 = weightRatios[i][1]; if (!stringMap.containsKey(c1)) { stringMap.put(c1, c2); map.put(c1, ratioValues[i]); } else { if (!stringMap.containsKey(c2)) { stringMap.put(c2, c1); map.put(c2, 1 / ratioValues[i]); } } } for (int i = 0; i < questions.length; i++) { // 根据0索引的字符在stringMap寻找1索引的字符 String c1 = questions[i][0]; String c2 = questions[i][1]; res[i] = findCharacter_process(c1, c2, stringMap, map); if (res[i] == -1.0000) { res[i] = 1 / findCharacter_process(c2, c1, stringMap, map); } } return res; } // [["a","b"],["b","c"]],[2.0,3.0],[["a","c"],["b","a"],["a","e"],["a","a"],["x","x"]] // [6.00000,0.50000,-1.00000,1.00000,-1.00000] public double findCharacter_process(String source, String target, HashMap<String, String> stringMap, HashMap<String, Double> map) { if (stringMap.containsKey(source) && source.equals(target)) { return 1.0; } double res = 1.0; String cur = source; while (true) { // 下面只是能直接找出的情况 if (stringMap.containsKey(cur)) { String c = stringMap.get(cur); if (c.equals(target)) { return res * map.get(cur); } if (c == source) { return -1; } res *= map.get(cur); cur = c; } else { return -1; } } } }
HashMap是去重的,所以如果有两个key值相同但value值不同的元素,就会替换掉一个,所以 最后就会造成结果的不正确性
- 解决:如果key和value都相同,直接去重,如果只有key值相同,那么将这两个中的一个翻转,然后再比较是否还有相同的key,如果有,丢弃
- 如果没有添加到map中,重复此操作,直到map中确保信息都添加进去为止 这样确保了map将信息完全接收(生成了最小生成组)
第二个需要解决的问题:我们如何将map中的值和它们对应的商值映射在一起?,并且怎么通过map找到它们对应的商值?
- 由于我们生成了最小生成组,所以它们的key值是唯一的,所以根据它们的key和value的组合的不同,
- 再次创建一个map1用来映射key和value的double值记作key->double