https://leetcode.com/problems/top-k-frequent-elements/
проблема возникает в строке:
хм.remove(currentGreatestValue);
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
for (int i=0; i<nums.length; i++){
if (!hm.containsKey(nums[i])){
hm.put(nums[i], 1);
} else {
int occurances = hm.get(nums[i]);
occurances = occurances + 1;
hm.put(nums[i], occurances);
}
}
int mostOccuredValues[] = new int[k];
Iterator hmIterator = hm.entrySet().iterator();
int currentGreatestValue=0;
int currentValue;
int nextGreatestIndex=0;
for (int i=0; i<k; i++){
while (hmIterator.hasNext()) {
Map.Entry mapElement = (Map.Entry)hmIterator.next();
currentValue = (int)mapElement.getKey();
if (currentValue>currentGreatestValue){
currentGreatestValue = currentValue;
}
}
mostOccuredValues[nextGreatestIndex] = hm.get(currentGreatestValue);
nextGreatestIndex = nextGreatestIndex + 1;
hm.remove(currentGreatestValue);
}
return mostOccuredValues;
}
}
хотите удалить ключ из хэш-карты, чтобы получить следующий наибольший элемент во время итерации
Вам будет полезно научиться использовать отладчик.




Переместите эти две строки внутрь цикла. Вам необходимо сбросить эти два значения после каждой итерации цикла.
for (int i=0; i<k; i++){
currentGreatestValue = 0;
Iterator hmIterator = hm.entrySet().iterator();
Спасибо за ответ, который был частью проблемы, также я перепутал ключ/значения, когда удалял в цикле, я опубликовал ответ ниже.
Пара проблем. Я сравнивал ключи вместо значений: в исходном коде ключ сохраняется как текущее значение. Затем мне пришлось сохранить ключи, когда я нашел наибольшее значение, чтобы потом удалить его.
Я разместил правильный ответ ниже, вы можете увидеть разницу.
Большой. Я ответил только на то, почему вы получаете нулевой указатель.
класс Решение { public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
for (int i=0; i<nums.length; i++){
if (!hm.containsKey(nums[i])){
hm.put(nums[i], 1);
} else {
int occurances = hm.get(nums[i]);
occurances = occurances + 1;
hm.put(nums[i], occurances);
}
}
int mostOccuredValues[] = new int[k];
int currentValue;
int currentKey;
int nextGreatestIndex=0;
for (int i=0; i<k; i++){
int currentGreatestValue=0;
int currentGreatestKey=0;
Iterator hmIterator = hm.entrySet().iterator();
while (hmIterator.hasNext()) {
Map.Entry mapElement = (Map.Entry)hmIterator.next();
currentValue = (int)mapElement.getValue();
currentKey = (int)mapElement.getKey();
if (currentValue>currentGreatestValue){
currentGreatestValue = currentValue;
currentGreatestKey = currentKey;
}
}
mostOccuredValues[nextGreatestIndex] = currentGreatestKey;
nextGreatestIndex = nextGreatestIndex + 1;
hm.remove(currentGreatestKey);
}
return mostOccuredValues;
}
}
Спасибо за код. Я ее не читал и не знаю, может ли она ответить на ваш вопрос и как. Пожалуйста, предоставьте некоторые пояснения вместе с кодом.
Почему за это проголосовали отрицательно, это правильный ответ, и часть ответа связана с исправленным нулевым указателем, это полная проблема с литкодом.
Я проголосовал против, потому что код без объяснений бесполезен для других пользователей, каким бы правильным он ни был. Stack Overflow не является сервисом обмена кодом. Это место, куда люди приходят и получают ответы на вопросы. Я знаю, что вы опубликовали это из доброй воли, чтобы помочь другим в вашей ситуации, и спасибо за желание сделать это. Однако я боюсь, что ваш ответ в его нынешнем виде не поможет.
Кстати, и я надеюсь, что это не разочарует. В вашей ссылке также написано «Последующие действия»: временная сложность вашего алгоритма должна быть лучше, чем
O(n log n), где n — размер массива. Вы еще не там.