java - una - tiempo de carga de pilas recargables
¿Cómo encontrar el valor entero máximo en una pila sin usar max() o iterar sobre él? (14)
Me preguntaron en una entrevista la siguiente pregunta: si tiene una pila de enteros, ¿cómo encontraría el valor máximo de la pila sin usar Collections.max y sin iterar sobre la pila y comparar elementos? Respondí con el código a continuación, ya que no conozco otra forma que no sea el uso de ninguna API de colecciones o la iteración sobre la pila y el uso de comparaciones. ¿Algunas ideas?
import java.util.Collections;
import java.util.Stack;
public class StackDemo {
public static void main(String[] args){
Stack lifo = new Stack();
lifo.push(new Integer(4));
lifo.push(new Integer(1));
lifo.push(new Integer(150));
lifo.push(new Integer(40));
lifo.push(new Integer(0));
lifo.push(new Integer(60));
lifo.push(new Integer(47));
lifo.push(new Integer(104));
if(!lifo.isEmpty()){
Object max = Collections.max(lifo);
System.out.println("max=" + max.toString());
}
}
}
1 x -Pulsa el elemento x en la pila.
2 -Elimina el elemento presente en la parte superior de la pila.
3 -Imprimir el elemento máximo en la pila.
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack <StackItem> st = new Stack <StackItem> ();
int n = sc.nextInt();//number of choice
int choice;
int max = 0;
for (int i = 0; i<n; i++) {
choice = sc.nextInt();
if (choice == 1) {//insert/push an item
int newInt = sc.nextInt();
if (!st.isEmpty()) {
max = st.peek().currentMax;
} else {
max = 0;
}
if (newInt > max) {
max = newInt;
}
StackItem item = new StackItem(newInt, max);
st.push(item);
} else if (choice == 2) {//pop
if (!st.isEmpty()) st.pop();
} else if (choice == 3) {//print the maximum item
System.out.println(st.peek().currentMax);
}
}
}
}
class StackItem {
int val;
int currentMax;
StackItem(int val, int max) {
this.val = val;
this.currentMax = max;
}
}
Aquí está mi solución:
import java.util.Arrays;
import java.util.Collections;
import java.util.Stack;
public class StackDemo {
public static void main(String[] args){
Stack lifo = new Stack();
lifo.push(new Integer(4));
lifo.push(new Integer(1));
lifo.push(new Integer(150));
lifo.push(new Integer(40));
lifo.push(new Integer(0));
lifo.push(new Integer(60));
lifo.push(new Integer(47));
lifo.push(new Integer(104));
Object lifoArray[] = lifo.toArray();
Arrays.sort(lifoArray);
System.out.println(lifoArray[lifoArray.length-1]);
}
}
Arrays.sort()
organiza en orden ascendente, por lo que el último valor en la matriz ordenada será el valor máximo.
Cuando inserta elementos en la pila, actualice el valor máximo
void main()
int max = Integer.min
lifo.push(1)
mientras
void push(Integer value) {
//push into stack
//update max value
}
Este codigo
public static Integer max(Stack stack) {
if (stack.isEmpty()) {
return Integer.MIN_VALUE;
}
else {
Integer last = (Integer)stack.pop();
Integer next = max(stack);
stack.push(last);
if (last > next) {
return last;
}
else {
return next;
}
}
}
public static void main(String[] args){
Stack lifo = new Stack();
lifo.push(new Integer(4));
lifo.push(new Integer(1));
lifo.push(new Integer(150));
lifo.push(new Integer(40));
lifo.push(new Integer(0));
lifo.push(new Integer(60));
lifo.push(new Integer(47));
lifo.push(new Integer(104));
System.out.println(Arrays.deepToString(lifo.toArray()));
System.out.println(max(lifo));
System.out.println(Arrays.deepToString(lifo.toArray()));
}
salidas:
[4, 1, 150, 40, 0, 60, 47, 104]
150
[4, 1, 150, 40, 0, 60, 47, 104]
Es una recursión en una pila dada, encuentra el elemento máximo y no cambia el orden de la pila.
Sin embargo, la iteración es diferente de la recursión solo si la define así . Además, para encontrar el máximo, debe comparar todos los elementos de alguna manera, en cualquier forma matemática, con operadores relacionales o bitwise como lo showed Anirudh. En mi humilde opinión, tarea bastante vagamente definida.
Esto se puede hacer en tiempo O (1) y en memoria O (n). Modifique el método push y pop (o, por herencia, extienda la pila estándar con la suya propia) para realizar un seguimiento del máximo actual en otra pila.
Cuando coloca elementos en su pila, presione max (currentElem, maxStack.peek ()) en maxStack Cuando saque elementos de la pila, también extraiga el máximo actual de su pila máxima.
Esta solución lo ilustra bien, por lo que no me extenderé más: https://.com/a/3435998/1007845
No estoy seguro de que esto satisfaga la necesidad de su pregunta, pero de esta manera el uso de max()
y la iteration
podrían evitarse, de todos modos la sort
usa la iteration
y Comparable
en segundo plano.
if (!lifo.isEmpty()) {
Stack sc = (Stack) lifo.clone();
Collections.sort(sc);
System.out.println("max=" + sc.get(sc.size() - 1));
}
Puede utilizar el operador bitwise en su lugar ...
public int getMax(int a, int b)
{
int c = a - b;
int k = (c >> 31) & 0x1;
int max = a - k * c;
return max;
}
Ahora puedes hacer
int max=Integer.MIN_VALUE-1;
while(!stack.empty())
{
max=getMax(max,stack.pop());
}
Puedes convertirlo en un TreeSet
con:
int myMax = new TreeSet<Integer>(lifo).last();
Sin iteración puedes hacer una llamada recursiva. Si no es tarea, no es lógico hacerlo. O, alternativamente, puede hacer esto sin iteración y recursión.
Sin embargo, un enfoque rápido y simple está aquí:
public class StackDemo {
public static int max = 0; //set this to least, may be negative
public static Stack lifo = new Stack();
public static void main(String[] args){
pushToStack(new Integer(4));
pushToStack(new Integer(1));
if(!lifo.isEmpty()){
Object max = Collections.max(lifo);
System.out.println("max=" + max);
}
}
void static int pushToStack(Integer value){
lifo.push(value);
if(max<value){
max = value;
}
return max;
}
}
Tiempo para pensar fuera de la caja. Use la API REST de Wolfram Alpha y pídale que calcule el resultado de:
"maximum of " + Arrays.deepToString(lifo.toArray())
Usando Collections.min()
lugar:
if (!lifo.isEmpty()) {
Integer max = Collections.min(lifo, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
System.out.println("max=" + max.toString());
}
Tenga en cuenta que el Comparator
personalizado invierte la comparación para que Collections.min()
devuelva el máximo.
Use Collections.sort con un Comparator que ordene en orden descendente y luego eche un vistazo al elemento superior de la Pila.
Editar:
sin iterar sobre la pila
en realidad no prohíbe toda iteración. Más bien, la pregunta solo prohíbe hacer lo simple.
for (Integer i : lifo)
Por lo tanto, esta solución satisface las limitaciones de la pregunta.
Simplemente vacía una copia de la pila. extraiga cada uno de los elementos de la copia, verificando el máximo contra un entero todo el tiempo.
Stack<Integer> lifoCopy = (Stack<Integer>) lifo.clone();
int max = Integer.MIN_VALUE;
while (!lifoCopy.isEmpty())
{
max = Math.max(lifoCopy.pop(), max);
}
System.out.println("max=" + max.toString());
Esto funcionará para usted en un tiempo O (n) incluso si sus entrevistadores deciden ser más restrictivos y no permiten más funciones integradas (máx, mín, clasificación, etc.).
Además, si necesita que el original no esté dañado, pero no puede usar el clon, puede hacerlo con una pila adicional:
Stack<Integer> reverseLifo = new Stack<Integer>();
int max = Integer.MIN_VALUE;
while (!lifo.isEmpty())
{
int val = lifo.pop();
max = Math.max(val, max);
reverseLifo.push(val);
}
while (!reverseLifo.isEmpty())
{
lifo.push(reverseLifo.pop());
}
System.out.println("max=" + max.toString());
Finalmente, esto supone que la comparación con una variable temporal es aceptable. Si no se permite ninguna comparación, entonces esta solución junto con este método funcionará.
import java.util.Collections;
import java.util.Stack;
public class StackDemo {
public static void main(String[] args) {
Stack lifo = new Stack();
lifo.push(new Integer(4));
lifo.push(new Integer(1));
lifo.push(new Integer(150));
lifo.push(new Integer(40));
lifo.push(new Integer(0));
lifo.push(new Integer(60));
lifo.push(new Integer(47));
lifo.push(new Integer(104));
System.out.println("max= 150"); // http://xkcd.com/221/
}
}