Решение одного числа по Haspmap, возвращаемое всегда будет "@" - PullRequest
1 голос
/ 27 февраля 2020

Это вопрос от leetcode. Leetcode - один номер I .

  • Номер Sinlge: Учитывая непустой массив целых чисел, каждый элемент появляется дважды, кроме одного. Найдите этот единственный. Входные данные: [2,2,1] Выходные данные: 1

Я хотел бы использовать hashmap для ее решения, но там ошибка в том, что мой ключ возврата всегда будет "@".

Вот код:

class Solution {
public int singleNumber(int[] nums) {
    char[] y = ("" + nums).toCharArray();
    int size=y.length;

    Map<Character,Integer>map=new HashMap<>();
    int i =0;
    while(i!=size) {
        if(map.containsKey(y[i])==false) {
            map.put(y[i],1);
        }
        else {
            int oldval=map.get(y[i]);
            int newval=oldval+1;
            map.put(y[i],newval);
        }
        ++i;
    }

    Set<Map.Entry<Character,Integer>>hmp=map.entrySet();
    for(Map.Entry<Character,Integer>data:hmp) {
        if(data.getValue()==1){
           return data.getKey();
        }
    }
     return 0;
}
}

Я не знаю, что не так. (может быть, часть getkey ()?)

Мне кажется, вся ваша помощь!

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Сделайте это с помощью побитового xor:

int result = 0;
for (int n : nums) {
  result ^= n;
}
return result;

Это работает, потому что:

  • a ^ 0 = a,
  • a ^ a = 0
  • a ^ b = b ^ a
  • (a ^ b) ^ c = a ^ (b ^ c)

, поэтому парные числа взаимно исключают друг друга, где бы они ни находились в массиве.


Обратите внимание, что пока это совсем другой подход к вашему ответу, вы можете применить аналогичный подход к использованию Map:

Map<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
  if (!map.remove(n)) {
    map.add(n, n);
  }
}

Это добавляет и удаляет пары элементов с карты; в конце на карте должно остаться только 1 непарное значение.

return map.keySet().iterator().next();

(здесь на самом деле нет смысла использовать Map, вы также можете использовать Set).

2 голосов
/ 27 февраля 2020
char[] y = ("" + nums).toCharArray();

не преобразует ваш массив int в массив char.

"" + nums создаст String, который выглядит как "[I@33909752", поэтому вызов toCharArray() при этом String создаст массив char, который содержит символ '@', поэтому вы получаете этот символ в качестве выходного (это первый неповторяющийся символ в вашем HashMap).

В любом случае, вам не нужно пытаться преобразовать входной массив int в массив char.

Просто используйте Map<Integer,Integer> и работайте с nums массив напрямую.

Этот код будет работать:

public static int singleNumber(int[] nums) {
    Map<Integer,Integer> map=new HashMap<>();
    for (int i : nums) {
        if(!map.containsKey(i)) {
            map.put(i,1);
        } else {
            int oldval=map.get(i);
            int newval=oldval+1;
            map.put(i,newval);
        }
    }

    Set<Map.Entry<Integer,Integer>>hmp=map.entrySet();
    for(Map.Entry<Integer,Integer>data:hmp) {
        if(data.getValue()==1){
           return data.getKey();
        }
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...