LeetCode agrupación ectópica de 49 letras y 50pow (x, n) y 51 ocho reinas

Cuenta pública original: bigsaisi es buena, ¡recuerda darle me gusta y cobrar!
Siga y responda a bigsai para recibir recursos avanzados en PDF de Java, y responda al grupo para unirse al grupo de punch de Likou .
Contenido de registro la semana pasada : multiplicación de 43 cuerdas y 44 combinación de comodines 45 juego de saltos y 46 arreglo completo
Contenido de registro de ayer : LeetCode 47 arreglo completo Ⅱ y 48 imágenes giratorias

Agrupación disfórica de letras

Dada una serie de cadenas, combine la letra dislexia. Las palabras alifáticas se refieren a cadenas con las mismas letras pero con diferentes disposiciones.

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Descripción:

Todas las entradas están en minúsculas.
No se considera el orden en el que se emiten las respuestas.

análisis

El significado del título es dar varias palabras de cadena y luego poner todas las mismas letras en una List<String>. Nuestra pregunta central es ¿dónde poner esto?

Puede usar la enumeración de fuerza bruta para juzgar cada vez, pero eso es demasiado ineficiente, por lo que podemos usar el almacenamiento de hash . Crea un Map<String,List<String>>tipo de HashMap para almacenamiento.
Inserte la descripción de la imagen aquí

El código de implementación es:

public List<List<String>> groupAnagrams(String[] strs) {
    
    
       List<List<String>>lists=new ArrayList<>();
       Map<String,List<String>>map=new HashMap<>();
       for(String str: strs)
       {
    
    
           char vachar[]=str.toCharArray();
           Arrays.sort(vachar);
           String team=String.copyValueOf(vachar);
           List<String>list=map.getOrDefault(team,new ArrayList<>());
           list.add(str);
           map.put(team,list);
       }
//        for(List<String> list:map.values())
//        {
    
    
//            lists.add(list);
//        }
       lists.addAll(map.values());
       return  lists;
   }

Resultados del:
Inserte la descripción de la imagen aquí

Pow (x, n)

Inserte la descripción de la imagen aquí
Obviamente, un algoritmo de exponenciación rápido, recomiendo encarecidamente mi propia introducción de exponenciación rápida: estructura de datos y algoritmo; esta puede ser la explicación de exponenciación rápida más fácil,
pero debe prestar atención a algunos puntos:

  • El procesamiento de números negativos y el número negativo pueden ser el valor mínimo de int más un valor de conversión de signo fuera de límites . Por lo tanto, cuando un número negativo se convierte en un número positivo, la potencia negativa se puede convertir en una potencia positiva para el cálculo. Por ejemplo, 5 -2147483648 = 5 -1 x 5 -2147483647 = (1/5) x (1/5) 2147483647 . El intervalo int es [-2147483648,2147483647].
  • Preste atención a la condición de parada. En teoría, puede reescribir una función para optimizarla ligeramente, pero debido a que la complejidad del nivel de registro de potencia rápido es relativamente baja, no la optimizaré y escribiré directamente:
 public double myPow(double x, int n) {
    
    
     if(n<0)
         return  (1.0/x)*myPow(1.0/x,-(n+1));
     if(n==0)
         return 1;
     else if(n%2==0)
         return myPow(x*x,n/2);
     else
         return x*myPow(x*x,n/2);
 }

Inserte la descripción de la imagen aquí

Reina N

El problema de las n reinas estudia cómo colocar n reinas en un tablero de ajedrez de n × n y hacer que las reinas no puedan atacarse entre sí.
Inserte la descripción de la imagen aquí
La imagen de arriba muestra una solución al problema de las 8 reinas.
Dado un número entero n, devuelve soluciones a todos los diferentes problemas de n reinas.
Cada solución contiene un plan claro de colocación de peones para el problema de n-damas, en el que 'Q' y '.' Representan la dama y la posición vacía respectivamente.

Ejemplo:

输入:4
输出:[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

Consejo: las
reinas no pueden atacarse entre sí, es decir: no puede haber dos reinas en la misma línea horizontal, vertical o diagonal.

Leeré este artículo sobre el problema de las ocho reinas: algoritmo de retroceso | Recordando el problema de las ocho reinas que nos ha desconcertado en esos años . Ya está muy claro. Si no lo entiendes, puedes mirarlo en detalle.

En la implementación específica, se necesita un map[][]mapa para registrar los símbolos de cada ubicación, y luego se almacena de acuerdo con las reglas, pero aquí uso una StringBuilder[]matriz para completar.
Además, al juzgar la dirección línea por línea, no es necesario juzgar la dirección horizontal.
Adjunta el código:

// boolean heng[];
 boolean shu[];
 boolean zuoxie[];
 boolean youxie[];

 	 public List<List<String>> solveNQueens(int n) {
    
    
	List<List<String>> list=new ArrayList<List<String>>();
	StringBuilder stringBuilder[]=new StringBuilder[n];
	for(int i=0;i<n;i++)
	{
    
    
		stringBuilder[i]=new StringBuilder();
		for(int j=0;j<n;j++)
		{
    
    
			stringBuilder[i].append('.');
		}
	}
	shu=new boolean[n];
	zuoxie=new boolean[n*2];
	youxie=new boolean[n*2];
	dfs(0,stringBuilder,list,n);
	return list;
 }

private void dfs(int index, StringBuilder sBuilder[], List<List<String>> list,int n) {
    
    
	// TODO Auto-generated method stub
	if(index==n)//存入
	{
    
    
		List<String>val=new ArrayList<String>();
		//StringBuilder sBuilder=new StringBuilder();
		for(int i=0;i<n;i++)
		{
    
    
			val.add(sBuilder[i].toString());
			
		}
		list.add(val);
	}
	else {
    
    
		for(int j=0;j<n;j++)
		{
    
    
			if(!shu[j]&&!zuoxie[index+j]&&!youxie[index+(n-1-j)])
			{
    
    
				shu[j]=true;
				zuoxie[index+j]=true;
				youxie[index+(n-1-j)]=true;
				//map[index][j]='Q';
				sBuilder[index].setCharAt(j, 'Q');
				dfs(index+1,sBuilder, list, n);
				shu[j]=false;
				zuoxie[index+j]=false;
				youxie[index+(n-1-j)]=false;
				sBuilder[index].setCharAt(j, '.');
				//map[index][j]='.';
				
			}
		}
	}	
}

Siempre familiar 100%:
Inserte la descripción de la imagen aquí

Conclusión: Muy bien, estamos aquí hoy, bienvenidos a prestar atención a la cuenta pública de tecnología original: [ bigsai ], responda al grupo y agregue el WeChat del autor para unirse al registro. Responda a " bigsai " para recibir recursos avanzados.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_40693171/article/details/109411577
Recomendado
Clasificación