zoukankan      html  css  js  c++  java
  • leetcode hashmap

    187. Repeated DNA Sequences

    求重复的DNA序列

    public List<String> findRepeatedDnaSequences(String s) {
        Set seen = new HashSet(), repeated = new HashSet();
        for (int i = 0; i + 9 < s.length(); i++) {
            String ten = s.substring(i, i + 10);
            if (!seen.add(ten))
                repeated.add(ten);
        }
        return new ArrayList(repeated);
    }

    hashset   !seen.add(ten) 添加失败返回false

    299 Bulls and Cows

    有一个四位数字,你猜一个结果,然后根据你猜的结果和真实结果做对比,提示有多少个数字和位置都正确的叫做bulls,还提示有多少数字正确但位置不对的叫做cows,根据这些信息来引导我们继续猜测正确的数字。这道题并没有让我们实现整个游戏,而只用实现一次比较即可。给出两个字符串,让我们找出分别几个bulls和cows。这题需要用哈希表,来建立数字和其出现次数的映射。我最开始想的方法是用两次遍历,第一次遍历找出所有位置相同且值相同的数字,即bulls,并且记录secret中不是bulls的数字出现的次数。然后第二次遍历我们针对guess中不是bulls的位置,如果在哈希表中存在,cows自增1,然后映射值减1,参见如下代码:

    class Solution {
    public:
        string getHint(string secret, string guess) {
            int m[256] = {0}, bulls = 0, cows = 0;
            for (int i = 0; i < secret.size(); ++i) {
                if (secret[i] == guess[i]) ++bulls;
                else ++m[secret[i]];
            }
            for (int i = 0; i < secret.size(); ++i) {
                if (secret[i] != guess[i] && m[guess[i]]) {
                    ++cows;
                    --m[guess[i]];
                }
            }
            return to_string(bulls) + "A" + to_string(cows) + "B";
        }
    };

    我们其实可以用一次循环就搞定的,在处理不是bulls的位置时,我们看如果secret当前位置数字的映射值小于0,则表示其在guess中出现过,cows自增1,然后映射值加1,如果guess当前位置的数字的映射值大于0,则表示其在secret中出现过,cows自增1,然后映射值减1,参见代码如下:

    public String getHint(String secret, String guess) {
        int bulls = 0;
        int cows = 0;
        int[] numbers = new int[10];
        for (int i = 0; i<secret.length(); i++) {
            int s = Character.getNumericValue(secret.charAt(i));
            int g = Character.getNumericValue(guess.charAt(i));
            if (s == g) bulls++;
            else {
                if (numbers[s] < 0) cows++;
                if (numbers[g] > 0) cows++;
                numbers[s] ++;
                numbers[g] --;
            }
        }
        return bulls + "A" + cows + "B";
    }


    49. Group Anagrams

    hashmap操作

    public class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            if (strs == null || strs.length == 0) return new ArrayList<List<String>>();
            Map<String, List<String>> map = new HashMap<String, List<String>>();
            for (String s : strs) {
                char[] ca = s.toCharArray();
                Arrays.sort(ca);
                String keyStr = String.valueOf(ca);
                if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>());
                map.get(keyStr).add(s);
            }
            return new ArrayList<List<String>>(map.values());
        }
    }

    743. Network Delay Time

    1. Use Map<Integer, Map<Integer, Integer>> to store the source node, target node and the distance between them.
    2. Offer the node K to a PriorityQueue.
    3. Then keep getting the closest nodes to the current node and calculate the distance from the source (K) to this node (absolute distance). Use a Map to store the shortest absolute distance of each node.
    4. Return the node with the largest absolute distance.
    public int networkDelayTime(int[][] times, int N, int K) {
            if(times == null || times.length == 0){
                return -1;
            }
            // store the source node as key. The value is another map of the neighbor nodes and distance.
            Map<Integer, Map<Integer, Integer>> path = new HashMap<>();
            for(int[] time : times){
                Map<Integer, Integer> sourceMap = path.get(time[0]);
                if(sourceMap == null){
                    sourceMap = new HashMap<>();
                    path.put(time[0], sourceMap);
                }
                Integer dis = sourceMap.get(time[1]);
                if(dis == null || dis > time[2]){
                    sourceMap.put(time[1], time[2]);
                }
                
            }
    
            //Use PriorityQueue to get the node with shortest absolute distance 
            //and calculate the absolute distance of its neighbor nodes.
            Map<Integer, Integer> distanceMap = new HashMap<>();
            distanceMap.put(K, 0);
            PriorityQueue<int[]> pq = new PriorityQueue<>((i1, i2) -> {return i1[1] - i2[1];});
            pq.offer(new int[]{K, 0});
            int max = -1;
            while(!pq.isEmpty()){
                int[] cur = pq.poll();
                int node = cur[0];
                int distance = cur[1];
    
                // Ignore processed nodes
                if(distanceMap.containsKey(node) && distanceMap.get(node) < distance){
                    continue;
                }
                
                Map<Integer, Integer> sourceMap = path.get(node);
                if(sourceMap == null){
                    continue;
                }
                for(Map.Entry<Integer, Integer> entry : sourceMap.entrySet()){
                    int absoluteDistence = distance + entry.getValue();
                    int targetNode = entry.getKey();
                    if(distanceMap.containsKey(targetNode) && distanceMap.get(targetNode) <= absoluteDistence){
                        continue;
                    }
                    distanceMap.put(targetNode, absoluteDistence);
                    pq.offer(new int[]{targetNode, absoluteDistence});
                }
            }
            // get the largest absolute distance.
            for(int val : distanceMap.values()){
                if(val > max){
                    max = val;
                }
            }
            return distanceMap.size() == N ? max : -1;
    }
  • 相关阅读:
    Ogre的骨骼动画
    ID卡读取方法(用于区分ID卡读取出来的数据和一般人手录入的数据)
    FastSpring学习笔记一
    数学 方程的解
    单调栈+桶+分治 奇袭
    神奇DP [HNOI2004] 打砖块
    DFS 找硬币
    树DP 树上染色
    android 适配器Adpter的使用总结 之 BaseExpandableListAdapter
    Java删除文件夹以及文件夹下的子目录与文件
  • 原文地址:https://www.cnblogs.com/34fj/p/9320686.html
Copyright © 2011-2022 走看看