Por favor, ayúdame a arreglar mi código. Algunos casos funcionan pero creo que casos como [9,1,2] no funcionarían porque el primer número es el más grande en ese caso. No estoy seguro de cómo arreglar eso en mi código.

public Key secondMaxKey () {
    Node max = first;
    Node max_2nd = first;

    if (size() < 2) {
        return null;
    }

    for (Node x = first; x != null;x = x.next) {

        if (x.key.compareTo(max.key) == 1) {
            max_2nd = max;
            max = x;
        } else if (x.key.compareTo(max_2nd.key) == 1) {
            max_2nd = x;
        }
    }
    return max_2nd.key;
}
3
broccoli lover 8 ene. 2017 a las 06:02

5 respuestas

La mejor respuesta

En mi opinión, primero verifica el tamaño y luego continúa con el algoritmo. Un pequeño cambio al suyo aquí, ya que usamos los dos primeros nodos para establecer el max y max_2 (dependiendo de los valores de estos). Luego procedemos como lo hiciste. Echale un vistazo. Espero eso ayude

public Key secondMaxKey () {
            if(size() < 2){
                return null;
            }
            Node max = null;
            Node max_2 = null;

            Node second = first.next;

            if(first.key.compareTo(second.key) > 0){
                max = first;
                max_2 = second;
            }   else{
                max = second;
                max_2 = first;
            }

            for (Node x=second.next; x != null;x=x.next)
            {
                if (x.key.compareTo(max.key) > 0)
                {
                    max_2=max;
                    max=x;
                }
                else if ((x.key.compareTo(max_2.key) > 0)
                        && (x.key.compareTo(max.key) < 0))
                {
                    max_2=x;
                }
            }
            return  max_2.key;
        }
1
Maciej Kowalski 8 ene. 2017 a las 17:55

Por favor, compruebe debajo de la lógica. He verificado su código aquí y devuelve el segundo máximo (Editado según LinkedListST en la pregunta)

   public Key secondMaxKey () {
    Node max = first;
    Node max_2nd = null;
    Node temp = null;

    if (size() < 2) {
        return null;
    }

    for (Node x = first.next; x != null; x = x.next) {
        if (x.key.compareTo(max.key)>0) {
            temp = max;
            max = x;
            if(temp.key.compareTo(max_2nd.key)>0)
            {
                max_2nd=temp;
            }

        } else if (max_2nd == null || x.key.compareTo(max_2nd.key) > 0) {
            max_2nd = x;
        }
    }

    return max_2nd.key;
}

Por ejemplo

{9,1,2}
Loop 1 (x=1) : max =9 max_2 =0 x=1 After loop max = 9 max_2 = 1
Loop 2 (x=2) : max =9 max_2 =1 x=2 After loop max = 9 max_2 = 2
0
Jojo John 8 ene. 2017 a las 17:32

Esto te ayuda

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        List l=new ArrayList();
        l.add(9);
        l.add(1);
        l.add(2);

        int max2=max_2nd(l);
        System.out.println(max2);
    }
    private static int max_2nd(List l) {

        Set s= new HashSet(l);
        s.remove(Collections.max(s));
        int i =(int)Collections.max(s);
        return i;

    }
}
0
vijay 8 ene. 2017 a las 04:38
public Key secondMaxKey() {
    if (this.size() <= 1)
        return null;
    if (this.size() == 2){
        if(first.key.compareTo(first.next.key) > 0){
            return first.next.key;
        }
    }
    Key max = first.key;
    Key secondMax = first.next.key;
    Node n = first;
    for (Node x = n.next; x != null; x = x.next) {
        if (x.key.compareTo(max) >= 0) {
            secondMax = max;
            max = x.key;
        } else if (x.key.compareTo(secondMax) > 0)
            secondMax = x.key;
    }
    return secondMax;
}

Creo que su problema es con la implementación. particularmente, estableciendo el segundo máximo al mismo nodo temporal que el máximo.

1
Joe Drool 11 feb. 2017 a las 04:06

Creo que debe iniciar max y max_2nd con nulo y verificar si son nulos en usted si las declaraciones:

public Key secondMaxKey () {
    Node max = null;
    Node max_2nd = null;

    if (size() < 2) {
        return null;
    }

    for (Node x = first; x != null; x = x.next) {
        if (max == null || x.val.compareTo(max.val) > 0) {
            max_2nd = max;
            max = x;
        } else if (max_2nd == null || x.val.compareTo(max_2nd.val) > 0) {
            max_2nd = x;
        }
    }

    return max_2nd.key;
}
0
Remy Cilia 8 ene. 2017 a las 06:02