682-Juego de béisbol

Descripción del Título

Ahora eres el grabador de un juego de béisbol con un formato especial. Este juego consta de varias rondas, y la puntuación en las últimas rondas puede afectar la puntuación en las próximas rondas.

Cuando comenzó el juego, el registro estaba en blanco. Obtendrá una lista de cadenas de operaciones que registra las operaciones, donde ops [i] es la i-ésima operación que necesita registrar, las operaciones siguen las siguientes reglas:

  1. Entero x-representa la nueva puntuación x obtenida en esta ronda
  2. "+": Indica que la nueva puntuación obtenida en esta ronda es la suma de las dos puntuaciones anteriores. Los datos del ítem garantizan que siempre hay dos puntuaciones válidas antes de que se registre esta operación.
  3. "D" -Indica que la nueva puntuación obtenida en esta ronda es el doble de la puntuación anterior. Los datos del ítem garantizan que siempre hay una puntuación válida frente al registro de esta operación.
  4. "C": indica que la puntuación anterior no es válida y se elimina del registro. Los datos del ítem garantizan que siempre hay una puntuación válida frente al registro de esta operación.
    Devuelva la suma de todas las puntuaciones en el registro.

Inserte la descripción de la imagen aquí

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/baseball-game Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

respuesta

  1. Solución 1
    Use una sentencia de juicio, que lleva mucho tiempo
int calPoints(char ** ops, int opsSize){
    
    
    int score[1000];
    int top=-1;
    int sum=0;

    for(int i=0;i<opsSize;i++)
    {
    
    
        if(ops[i][0]=='C')
        {
    
    
            top--;
        }
        else if(ops[i][0]=='D')
        {
    
    
            top++;
            score[top]=score[top-1]*2;
        }
        else if(ops[i][0]=='+')
        {
    
    
            top++;
            score[top]=score[top-1]+score[top-2];
        }
        else
        {
    
    
            top++;
            score[top]=0;
            if(ops[i][0]=='-')
            {
    
    
                for(int j=1;ops[i][j]!='\0';j++)
                {
    
    
                    score[top]*=10;
                    score[top]-=(int)ops[i][j]-48;
                }
            }
            else
            {
    
    
                for(int j=0;ops[i][j]!='\0';j++)
                {
    
    
                    score[top]*=10;
                    score[top]+=(int)ops[i][j]-48;
                }
            }
            
        }
    }

    for(int i=0;i<=top;i++)
    {
    
    
        sum+=score[i];
    }

    return sum;
}
  1. Mejora el
    uso del interruptor, el tiempo se acorta.
int calPoints(char ** ops, int opsSize){
    
    
    int score[1000];
    int top=-1;
    int sum=0;

    for(int i=0;i<opsSize;i++)
    {
    
    
        switch (ops[i][0])
        {
    
    
            case 'C':
                top--;
                break;
            case 'D':
                top++;
                score[top]=score[top-1]*2;
                break;
            case '+':
                top++;
                score[top]=score[top-1]+score[top-2];
                break;
            default:
                top++;
                score[top]=0;
                if(ops[i][0]=='-')
                {
    
    
                    for(int j=1;ops[i][j]!='\0';j++)
                    {
    
    
                        score[top]*=10;
                        score[top]-=(int)ops[i][j]-48;
                    }
                }
                else
                {
    
    
                    for(int j=0;ops[i][j]!='\0';j++)
                    {
    
    
                        score[top]*=10;
                        score[top]+=(int)ops[i][j]-48;
                    }
                }
                break;
        }
    }

    for(int i=0;i<=top;i++)
    {
    
    
        sum+=score[i];
    }

    return sum;
}
  1. Mejora 2
    1. Utilice la función atoi de la biblioteca del lenguaje C para convertir un entero de cadena en un entero, y el espacio utilizado aumenta ligeramente
    2. Utilice la función malloc para asignar memoria de acuerdo con la longitud de la cadena
int calPoints(char ** ops, int opsSize){
    
    
    int* score=(int *)malloc(opsSize*sizeof(int));
    int top=-1;
    int sum=0;

    for(int i=0;i<opsSize;i++)
    {
    
    
        switch (ops[i][0])
        {
    
    
            case 'C':
                top--;
                break;
            case 'D':
                top++;
                score[top]=score[top-1]*2;
                break;
            case '+':
                top++;
                score[top]=score[top-1]+score[top-2];
                break;
            default:
                top++;
                score[top]=atoi(ops[i]);          
                break;
        }
    }

    for(int i=0;i<=top;i++)
    {
    
    
        sum+=score[i];
    }

    return sum;
}

Supongo que te gusta

Origin blog.csdn.net/qq_36439722/article/details/112227165
Recomendado
Clasificación