[Una pregunta del día] Botón de fuerza 389. Encuentra la diferencia

Descripción del título ( portal )

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

Ejemplo 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

Ejemplo 2:

输入:s = "", t = "y"
输出:"y"

Ejemplo 3:

输入:s = "a", t = "aa"
输出:"a"

Ejemplo 4:

输入:s = "ae", t = "aea"
输出:"a"

Solución 1: reste el valor del código ACSII

Idea: describe el título como dos cadenasscontSolo hay una letra minúscula, por lo que la diferencia entre los valores del código ACSII de las dos cadenas es el código ACSII del carácter que no es el mismo, por lo que podemos hacer una resta. Aquí no sumamos todo para hacer la resta, pero siempre corresponde a la resta == (deben ser ts) == acumulados en ans, y finalmente ans más el último carácter de la cadena t.

public char findTheDifference(String s, String t) {
    
    
        int ans = 0;
        for (int i = 0; i < s.length(); i++) {
    
    
            ans += t.charAt(i)-s.charAt(i);
        }
       ans +=t.charAt(t.length()-1);
        return (char)(ans);
    }

Solución 2: operación de bits

Primero, veamos la operación XOR:

  • a ^ a = 0; El OR exclusivo de cualquier número y él mismo es 0
  • a ^ 0 = a; Cualquier número y 0 XOR sigue siendo suyo
  • a ^ b ^ a = a ^ a ^ b = b La operación XOR tiene ley conmutativa

Idea: lo haremosscontLas dos cadenas se fusionan en un todo, por lo que habrá un número impar de caracteres en total, y solo un carácter es un número impar, por lo que XOR todos los caracteres y el resto es la respuesta que está buscando.

public char findTheDifference(String s, String t) {
    
    
        char ans =0;
        for (int i = 0; i <s.length() ; i++) {
    
    
            ans ^= ((s.charAt(i))^(t.charAt(i)));
        }
        return (char)(ans^t.charAt(t.length()-1));
    }

Solución 3: utilice la operación de transmisión de Java

Referencia de operación de reducción relacionada: reducción en Xiaobai learn stream

  • Primera cadena juntos
  • La cadena se convierte a IntStream a través del operador de caracteres
  • Utilice reducir, XOR todos los valores. Finalmente convertido a tipo char.

3.1

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
        return (char)(s + t).chars().reduce(0, (a, b) -> a ^ b);
    }
}

3.2

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
         return (char)((s+t).chars().reduce((a, b) -> a ^ b).getAsInt());
    }
}

Solución 4: HashMap

Idea: use una tabla hash para realizar operaciones, recorra el número de caracteres que aparecen en la primera marca de cadena y luego recorra la segunda para restar el número de ocurrencias, hasta que sea 0 o la tabla hash original no exista, y no existe Eso significa que el valor de retorno es él.

public char findTheDifference11(String s, String t) {
    
    
        Map<Character,Integer> hashMap = new HashMap();
        for (int i = 0; i <s.length() ; i++) {
    
    
            hashMap.put(s.charAt(i),hashMap.getOrDefault(s.charAt(i),0)+1);
        }
        for (int i = 0; i <t.length() ; i++) {
    
    
            hashMap.put(t.charAt(i),hashMap.getOrDefault(t.charAt(i),0)-1);
            if(hashMap.get(t.charAt(i)) < 0) {
    
    
                return t.charAt(i);
            }

        }
        return ' ';

    }

Nota: Map en Java proporciona el método getOrDefault (), que proporciona valores predeterminados para valores de clave inexistentes.

Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/111370572
Recomendado
Clasificación