Devolviendo verdad si puedes dividir una lista en una lista más pequeña con mínimo dos valores en la lista separada de otra manera devolver falso
En una cubierta de tarjetas, cada tarjeta tiene un entero escrito en ella.
Regresar verdadero si es posible dividir toda la cubierta en 1 o más grupos de tarjetas, donde:
Cada grupo tiene al menos 2 cartas. Todas las cartas de cada grupo tienen el mismo entero.
Ejemplo:
Entrada: cubierta = [1,2,3,4,4,3,2,1]
Producto: verdadero
Explicación: Posible partición [1,1],[2,2],[3,3],[4,4]
.
Intenté resolver esto usando pila, pero no funciona como se espera y se está imponiendo falso donde se supone que debe imprimir verdad. He añadido comentario para la claridad de mi código.
package practicepkg;
import java.util.Stack;
public class DeckInteger {
public static void main(String[] args) {
Stack stack = new Stack();
//declaring individual variable for each integer and setting all of them to zero
int p_1=0,p_2=0,p_3=0,p_4=0,p_5=0,p_6=0,p_7=0,p_8=0,p_9=0;
//adding element which can form pair and should return true
stack.add(1);
stack.add(2);
stack.add(1);
stack.add(2);
stack.add(1);
stack.add(2);
//checking till stack is empty and comparing the top of stack to all the individual integer and incrementing them and popping the top element
while(stack.empty()==false) {
if(stack.peek()==1) {
p_1+=1;
stack.pop();
break;
} else if(stack.peek()==2) {
p_2+=1;
stack.pop();
break;
} else if(stack.peek()==3) {
stack.pop();
p_3+=1;
break;
} else if(stack.peek()==4) {
stack.pop();
p_4+=1;
break;
} else if(stack.peek()==5) {
stack.pop();
p_5+=1;
break;
} else if(stack.peek()==6) {
stack.pop();
p_6+=1;
break;
} else if(stack.peek()==7) {
stack.pop();
p_7+=1;
break;
} else if(stack.peek()==8) {
stack.pop();
p_8+=1;
break;
} else {
stack.pop();
p_9+=1;
break;
}
}
//checking if any of the integer variable have the value 1 then it cannot form pair as x>=2 so it should print false
if(p_1==1||p_2==1||p_3==1||p_4==1||p_5==1||p_6==1||p_7==1||p_8==1||p_9==1) {
System.out.println("False");
}
//print true as if any of the variable have a value other than one
else {
System.out.println("True");
}
}
}
Pregunta hecha hace 3 años, 4 meses, 29 días - Por webweaverx
4 Respuestas:
-
Si tienes
a_i
tarjetas con enteroi
, entonces todas las particiones posibles serían divisores dea_i
De lo contrario, esta tarjeta no puede dividirse. Por lo tanto sólo necesita contar todos los números únicos y calcular su mayor divisor común. Este mayor divisor común sería el mayor X posible.Respondida el Dec 17, 2020 a las 15:15 - por codecraftsman
Votos positivos: 0 | Votos negativos: 0 -
En el código que está usando
break
dentro de cadaif
condición. Así que se rompería elwhile
bucle en la primera iteración misma. Tan solop_1
Sería igual1
y todos los demás serían0
. Hay una manera mucho mejor de resolver esto usandoMaps
con llave como el entero y el valor como se cuentaSuponiendo la entrada como un array :
int[] input
private boolean isValidGroup(Stack
stack){ Map countMap = new HashMap<>(); while(!stack.empty()){ countMap.merge(stack.pop(),1,Integer::sum); } // The above map would contain the count for each integer. // For input : {1,2,4,2,4,3,1,3} , the map would be {1:2,2:2,3:2,4:2} List distinctCounts = countMap.values().stream().distinct().collect(Collectors.toList()); // The above list contains the distinct group counts. // Ideally the number of distinct count value should be 1 and the value should be >=2. //In such case, we return true. return (distinctCounts.size()==1 && distinctCounts.get(0)>=2); } Respondida el Dec 17, 2020 a las 15:20 - por scriptwarrior
Votos positivos: 0 | Votos negativos: 0 -
El problema en tu código es que estás utilizando el método
break
dentro de tus condicionales, lo cual está interrumpiendo el buclewhile
prematuramente. Esto hace que solo se compare el primer elemento de la pila y se salga del bucle.Una manera de abordar este problema es utilizar un HashMap para contar la frecuencia de cada entero en la pila. Luego, puedes verificar si cada entero tiene una cantidad igual o mayor a 2 para formar grupos de al menos dos cartas con el mismo entero. Aquí te dejo una posible implementación:
java import java.util.HashMap; import java.util.Map; import java.util.Stack; public class DeckInteger { public static void main(String[] args) { Stack
stack = new Stack<>(); stack.add(1); stack.add(2); stack.add(1); stack.add(2); stack.add(1); stack.add(2); Map freqMap = new HashMap<>(); // Contando la frecuencia de cada entero en la pila while (!stack.isEmpty()) { int current = stack.pop(); freqMap.put(current, freqMap.getOrDefault(current, 0) + 1); } // Verificando si cada entero tiene al menos 2 cartas for (int frequency : freqMap.values()) { if (frequency < 2) { System.out.println("False"); return; } } System.out.println("True"); } } Con esta implementación, se contará la frecuencia de cada entero en la pila y luego se verificará si cada entero tiene al menos dos cartas. Si se cumple la condición para todos los enteros, el programa imprimirá "True"; de lo contrario, imprimirá "False".
Respondida el Dec 18, 2020 a las 15:18 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema principal con tu código es que no estás manejando correctamente el caso en el que la pila
stack
contiene más de un elemento con el mismo valor. Esto puede llevar a resultados incorrectos.Aquí tienes una versión modificada de tu código que debería funcionar correctamente:
java import java.util.HashMap; import java.util.Map; import java.util.Stack; public class DeckInteger { public static void main(String[] args) { Stack
stack = new Stack (); Map map = new HashMap<>(); // Añadiendo elementos a la pila stack.add(1); stack.add(2); stack.add(1); stack.add(2); stack.add(1); stack.add(2); // Procesando la pila y contando las ocurrencias de cada entero while (!stack.empty()) { int num = stack.pop(); map.put(num, map.getOrDefault(num, 0) + 1); } // Comprobando si todos los enteros tienen al menos dos ocurrencias boolean isValid = true; for (int count : map.values()) { if (count < 2) { isValid = false; break; } } // Imprimiendo el resultado System.out.println(isValid ? "True" : "False"); } } En este código mejorado:
Utilizamos un
Map
llamadomap
para contar las ocurrencias de cada entero en la pila. Recorremos la pila y actualizamos el recuento para cada entero en elmap
.- Después, recorremos el `map` y comprobamos si todos los valores del recuento son mayores o iguales que 2. Si todos los recuentos son válidos, imprimimos "True"; de lo contrario, imprimimos "False".
Este enfoque garantiza que contemos correctamente las ocurrencias de cada entero y que podamos determinar si la división es posible o no.
Respondida el Dec 18, 2020 a las 15:29 - por Gemini
Votos positivos: 0 | Votos negativos: 0