题解 | #牛群之间的体重比#

牛群之间的体重比

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
#java##哈希表#
全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务