resolviendo el error para java algorthim

'el siguiente código funciona bien con ciertas entradas y no con otras, el código es una implementación de una lista enlazada circular dada una = longitud de la lista y k = pasos a seguir para eliminar el nodo, la intención es eliminar ese nodo que es en el incremento de k, por ejemplo, si [1,2,3] yk = 2, entonces el primer nodo que se eliminará es 2 y luego 1, por lo tanto, el último nodo sería 3, hay 2 casos de prueba en el código, el primero es n = 12 k = 4 y el resultado debe ser 1, pero obtengo 2 en el último paso de eliminación por alguna razón, el caso de prueba de seg es n = 12 k = 3 y el resultado debería ser 10, lo que funciona bien, así que no podría entender si alguien puede identificar la compra, lo agradezco, gracias '

 public static int whoIsElected(int n, int k) {
    LinkedList<Integer> circle = new LinkedList<>();
    for(int i=1;i<=n;i++)
    {
        circle.add(i);
    }
    int posToDel = k;

    if(n==1)
    {
        return 1;
    }
    if(posToDel>n)
    {
        posToDel=posToDel%n;
    }
    while(circle.size()>1)
    {
        if(posToDel==0)// becasue the posToDel-1 when posToDel ==0 is the last index
        {
            circle.remove(n-1);
        }
        else
        {
            circle.remove(posToDel-1);
        }
        n--; // decrease the length of n by 1 when u delete one from the list
        // after removing the posToDel in circle

        // this if else set the new posToDel
        if(posToDel==0)
        {
            posToDel=n-1;
        }
        else
        {
            posToDel=posToDel-1;
        }
        if(posToDel+k>n)
        {
            posToDel=(posToDel+k)%n;
        }
        else
        {
            posToDel=posToDel+k;
        }
    }
    return circle.get(0);
}

/**
 * bool doTestsPass()
 * Runs various tests. Returns true if tests pass. Otherwise,
 * returns false.
 */
public static boolean doTestsPass() {
    // todo: implement more tests, please
    // feel free to make testing more elegant
    // test cases are structered as {n, k, expected answer}
    int[][] testCases = {
            {12, 4, 1},// give wrong answer
            {12, 3, 10}// give right answer
    };

    for (int[] testCase : testCases) {
        int answer = whoIsElected(testCase[0], testCase[1]);
        if (answer != testCase[2]) {
            System.out.println("test failed!");
            System.out.printf("n:%d, k%d, answer got: %d, should be: %d\n", testCase[0], testCase[1], answer, testCase[2]);
            return false;
        }
    }
    System.out.println("All tested passed");
    return true;
}

/**
 * Execution entry point.
 */
public static void main(String args[]) {
    doTestsPass();
}

}

Respuesta 1

Supongo que el problema surge cuando solo quedan 3 elementos [1,2,9]

Entonces, al intentarlo manualmente, resulta que posToDel debería estar 3cuando el elemento 9 se va a eliminar, pero cuando lo ejecutamos en código, el valor posToDel es 0.

Puede intentar agregar registros de la consola y valores de seguimiento en diferentes momentos. Pero puede volverse desordenado rápidamente y podría terminar pasando más tiempo del requerido.

Sin embargo, puedo sugerirle que pruebe el siguiente algoritmo en la lógica del bucle:

Antes de la asignación de bucle posToDel= k-1, para que no tenga que hacer posToDel-1 en bucle cada vez (solo hace que construir diferentes lógicas en bucle sea un poco fácil con casos menos especiales)

He intentado debajo de la lógica en bucle, funciona bien para sus casos de prueba:

while( circle.size() > 1 )
        {
            int temp = circle.remove( posToDel );
            System.out.println( temp );
            n--;
            posToDel = posToDel - 1;
            System.out.println( "after deletion of " + temp + ", pos is: " + posToDel );
            if( posToDel + k >= n )
            {
                posToDel = ( posToDel + k ) % n;
            }
            else
            {
                posToDel = posToDel + k;
            }
        }

Se agregaron 2 declaraciones sysout para conocer el orden de eliminación, lo que podría ayudar en la depuración

Respuesta: 2

Estoy tratando de capturar imágenes de una aplicación flash que se ejecuta en un navegador y procesarlas en una aplicación Java. Hasta ahora, estoy usando (simplificado): Robot r; BufferedImage i = r ....

Tengo un proyecto de NetBeans. En el directorio del proyecto, he creado algunos directorios adicionales para mantener recursos (imágenes). Entonces, la ruta de una de mis imágenes es "/res/imgs/on.png" ("res" y ...

Estoy usando la biblioteca Java para JSON-RPC 2.0 de dzhuvinov. Tengo problemas para configurar mi nombre de usuario y contraseña para la autenticación de acceso básico para las llamadas. Mi código se ve así: public static ...

He intentado escribir una clase para convertir de UTC a zona horaria EST. Además, solo quiero que se almacene la parte de la fecha. Funciona correctamente Ahora estoy buscando varios casos de prueba JUnit para el método ...