findTheDifference-encuentra la diferencia (LeetCode389)

Título

Dadas dos cadenas s y t, solo contienen letras minúsculas.

La cadena t se reorganiza aleatoriamente por la cadena s, y luego se agrega una letra en una posición aleatoria.

Encuentre la letra agregada en t.

Ejemplo 1:

Entrada: s = "abcd", t = "abcde"
Salida: "e"
Explicación: 'e' es la letra que se agregó.

Ejemplo 2:

Entrada: s = "", t = "y"
Salida: "y"

Ejemplo 3:

Entrada: s = "a", t = "aa"
Salida: "a"

Ejemplo 4:

Entrada: s = "ae", t = "aea"
Salida: "a"

inmediato:

0 <= s.length <= 1000
t.length == s.length + 1
s y t solo contienen letras minúsculas

Ideas para resolver problemas

1. Cree dos StringBuilder, uno es la fuente se inicializa en la cadena s, el otro es el destino se inicializa en t
2. De acuerdo con el significado de la pregunta, el destino es un carácter más que la fuente, luego atraviesa la fuente, saca un elemento en la fuente y colóquelo en el destino Busque y elimine este elemento.
3. Elimina uno por uno, y finalmente queda solo un elemento en el objetivo, entonces este elemento es el resultado que queremos

el código se muestra a continuación:

class Solution {
    public char findTheDifference(String s, String t) {
           StringBuilder target=new StringBuilder(t);
           StringBuilder source=new StringBuilder(s);
        for (int i = 0; i < s.length(); i++) {
            char c = source.charAt(i);
            int index = target.indexOf(String.valueOf(c));
            target.deleteCharAt(index);
        }
        return target.charAt(0);

    }
}

Efecto de ejecución

La
respuesta de información fue exitosa:
tiempo de ejecución: 6 ms, derrotando al 16.30% de los usuarios de Java
Consumo de memoria: 38.4 MB, derrotando al 5.03% de los usuarios de Java

Ideas de resolución de problemas 2

A través de HashMap
1. Coloque las dos cadenas syt en dos hashmaps, coloque las letras existentes en la clave y almacene el número de letras en el valor
2. Haga un bucle en el hashmap de t, el valor es diferente de s, y regrese directamente

el código se muestra a continuación

class Solution {
    public  char findTheDifference(String s, String t) {
        Map<Character,Integer> source=new HashMap<>();
        Map<Character,Integer> target=new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            source.put(s.charAt(i),source.getOrDefault(s.charAt(i),0)+1);
            target.put(t.charAt(i),target.getOrDefault(t.charAt(i),0)+1);
        }
        target.put(t.charAt(t.length()-1),target.getOrDefault(t.charAt(t.length()-1),0)+1);
        Set<Character> characters = target.keySet();
        Iterator<Character> it = characters.iterator();
        while (it.hasNext())
        {
            Character next = it.next();
            if(source.get(next)==null)
                return next;
            if(target.get(next)!=source.get(next))
                return next;
        }
        return 'a';
    }
}

efecto

La
respuesta de información fue exitosa:
tiempo de ejecución: 13 ms, derrotando al 12.53% de los usuarios de Java
Consumo de memoria: 36.9 MB, derrotando al 61.44% de los usuarios de Java

Operación de bits (de leetcode-solution)

Esta pregunta dice que la cadena t es solo un carácter más que s, y el número de otros caracteres es el mismo. Si fusionamos la cadena s y t, encontraremos que, excepto por el carácter adicional que aparece un número impar de veces , los demás Todos los caracteres en son un número par de veces.Viendo aquí, podemos pensar fácilmente en 136. El número que aparece solo una vez. Entonces, siempre que sea la solución del problema 136, podemos usarlo.

Entonces, la forma más fácil de resolver este problema es usar la operación XOR Hay varias reglas sobre la operación XOR.

a ^ a = 0; El O exclusivo de cualquier número y él mismo es 0 a ^ 0 = a; ¿Es cualquier número exclusivo o de 0 o de sí mismo a b a = a a b La operación O exclusivo tiene la ley conmutativa
porque después de sy t se fusionan, los caracteres pares se convertirán en 0 después de ser XORed. Después de XORed los caracteres impares, seguirá siendo suyo. Solo necesitamos XOR todos los caracteres combinados. El código es el siguiente

public char findTheDifference(String s, String t) {
    char[] charArr = s.concat(t).toCharArray();
    char res = 0;
    for (char c : charArr) {
        res ^= c;
    }
    return res;
}

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/111353540
Recomendado
Clasificación