【问题标题】:Code implemented with HashMap fails when tested with array of size 30K使用大小为 30K 的数组进行测试时,使用 HashMap 实现的代码失败
【发布时间】:2019-09-10 04:13:05
【问题描述】:

我正在努力解决以下链接中的代码挑战,但从案例 13 到案例 19 都失败了。 我正在阅读 HashMap 可以获取大量数据,但我的解决方案似乎不适用于数组(杂志)为 30K 的情况。

以下是我实施的解决方案。

感谢您的帮助。

https://www.hackerrank.com/challenges/ctci-ransom-note/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=dictionaries-hashmaps

我用 4K 的数组测试了代码,效果很好

static void checkMagazine(String[] magazine, String[] note) {

    int initSize_m = (int) Math.ceil(magazine.length / 0.75);
    int initSize_n = (int) Math.ceil(note.length / 0.75);
    HashMap<Integer, String> m_hash= new HashMap<Integer, String>(initSize_m);
    HashMap<Integer, String> n_hash= new HashMap<Integer, String>(initSize_n);


    for(int i= 0; i < note.length; i++){
      n_hash.put(i, note[i]);
    }

    for(int i= 0; i < magazine.length; i++){
      m_hash.put(i, magazine[i]);
    }

    boolean flag=true;

    if(note.length<magazine.length){

    for (Map.Entry<Integer, String> entry : n_hash.entrySet()) {
        flag = m_hash.containsValue(entry.getValue());
        if(flag){
            m_hash.values().removeIf(v -> v.equals(entry.getValue()));
        }else{
            break;
        }
    }
    }else{

    for (Map.Entry<Integer, String> entry : m_hash.entrySet()) {
        flag = n_hash.containsValue(entry.getValue());
        if(flag){
            n_hash.values().removeIf(v -> v.equals(entry.getValue()));
        }else{
            break;
        }
    }
    }

    if(flag){
        System.out.println("Yes");
    }else{
        System.out.print("No");
    }


}

案例 13 到 19 失败

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    您的地图应该将单词作为键,将它们的计数作为值。按单词在输入中的位置映射单词并不能帮助您找到它们。

    Map(也称为Dictionary)的全部意义在于能够通过给定键快速找到值。在HashMap 的情况下,此操作为 O(1),而通过迭代所有条目值(如您的情况)来查找值要慢得多-> O(n)。我强烈建议您阅读地图和集合。

    这是一个正确的解决方案:

    public class HackerRank {
        public static void main(String[] args) {
            final Scanner in = new Scanner(System.in);
    
            final int numberOfWordsInMagazine = in.nextInt();
            final int numberOfWordsInNote = in.nextInt();
    
            final Map<String, Integer> wordsInMagazine = new HashMap<>();
            for (int i = 0; i < numberOfWordsInMagazine; i++) {
                final String word = in.next();
                wordsInMagazine.merge(word, 1, Integer::sum);
            }
    
    
            boolean canPrintMessage = true;
            for (int i = 0; i < numberOfWordsInNote; i++) {
                final String word = in.next();
    
                Integer remainingCount = wordsInMagazine.computeIfPresent(word, (key, value) -> value - 1);
                if (null == remainingCount || remainingCount < 0) {
                    canPrintMessage = false;
                    break;
                }
            }
    
            System.out.println(canPrintMessage ? "Yes" : "No");
        }
    }
    

    【讨论】:

    • 工作完美。感谢您的推动。我的意图是学习,我做到了。
    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2013-05-15
    • 2020-05-30
    • 2021-06-05
    • 1970-01-01
    • 2021-05-01
    • 2021-03-09
    相关资源
    最近更新 更多