Итерация по 2 картам в Java - PullRequest
0 голосов
/ 18 марта 2020

Выполнение commonCharacterCount из CodeSignal. Конечно, вы хотите узнать, сколько символов является общим.

Вот пример:

Для s1 = "aabcc" и s2 = "adcaa", вывод должен быть commonCharacterCount(s1, s2) = 3.

строки имеют 3 общих символа - 2 "a" s и 1 "c".

При построении карты с количеством символов для каждого. Затем я хочу проверить каждое значение на карте, и проверить их обоих. К ответу я добавлю минимальное количество символов в обеих Картах. Например, s1 = "aabcc" && s2 = "adcaa", mapS1['a'] = 2 && mapS2['a'] = 3, поэтому count += min(2,3) = 2

Это моя идея, но, как я уже упоминал, возникли проблемы с итерацией обеих карт.

Первый раз, используя значение карты в качестве счетного значения. Не могу точно сказать, является ли это лучшим способом увеличить значение на карте, поэтому я думаю, что мне понадобится и помощь с этим.

Заранее спасибо:)

static int res(String s1, String s2) {
                HashMap<Character, Integer> mapS1 = new HashMap<>();
                HashMap<Character, Integer> mapS2 = new HashMap<>();
                int count = 0;

                for(int i = 0; i < s1.length(); i++) 
                        mapS1.put(s1.charAt(i), mapS1.getOrDefault(s2.charAt(i), 0) + 1);

                for(int i = 0; i < s2.length(); i++) 
                        mapS1.put(s2.charAt(i), mapS2.getOrDefault(s2.charAt(i), 0) + 1);

                for(Map.Entry<Character, Integer> entry : mapS1.entrySet()) {
                        int a = mapS1.get(entry.getKey());
                        int b = mapS2.get(entry.getKey());

                        if(a > 0 && b >= 0) count += Math.min(a, b);
                } 

                return count;
}

ИСПРАВЛЕННАЯ И РАБОЧАЯ ВЕРСИЯ: Спасибо всем!

static int res(String s1, String s2) {
                HashMap<Character, Integer> mapS1 = new HashMap<>();
                HashMap<Character, Integer> mapS2 = new HashMap<>();
                int count = 0;

                for(int i = 0; i < s1.length(); i++)
                        mapS1.put(s1.charAt(i), mapS1.getOrDefault(s1.charAt(i), 0) + 1);
                for(int i = 0; i < s2.length(); i++)
                        mapS2.put(s2.charAt(i), mapS2.getOrDefault(s2.charAt(i), 0) + 1);

                for(Map.Entry<Character, Integer> entry : mapS1.entrySet()) {
                        int a = mapS1.getOrDefault(entry.getKey(), 0);
                        int b = mapS2.getOrDefault(entry.getKey(), 0);
                        System.out.println(a + " " + b);
                        count += Math.min(a, b);
                }

                return count;
        }
```


Ответы [ 2 ]

1 голос
/ 18 марта 2020

В вашем коде есть две проблемы. Во-первых, «менее важным» является ошибка копирования и вставки. Во втором l oop вы снова добавляете элементы в mapS1, я полагаю, это должно было быть mapS2.

. Как вы упомянули в комментарии, основная проблема заключается в NullPointerException, которое вы получаете в этой строке:

int b = mapS2.get(entry.getKey());

Это вызвано тем фактом, что если нет никакого значения для данного ключа, он возвращает null. Тогда это null должно быть присвоено b, что является int. int переменные не принимают нулевые значения и, следовательно, выбрасывают NPE. Самое простое решение - вернуть значение по умолчанию, если сопоставление отсутствует. Вы можете сделать это так:

int b = mapS2.getOrDefault(entry.getKey(), 0);
0 голосов
/ 18 марта 2020

Я думаю, у вас есть ошибка здесь:

 for(int i = 0; i < s2.length(); i++) 
        mapS1.put(...); //<------ should be mapS2.put?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...