[Tablas lineales de entrenamiento de algoritmos] Día 03

Directorio de artículos

tema uno

Elimine todos los elementos cuyo valor esté entre los valores dados s y t (requiere s <t) de la tabla de secuencia ordenada. Si s o t no es razonable o la tabla lineal está vacía, se mostrará un mensaje de error y se cerrará la operación.

Análisis de ideas

  1. En primer lugar, la estructura de datos proporcionada en el título es una lista ordenada, por lo que para encontrar el valor en el intervalo [s,t], solo necesita determinar la ubicación de los dos puntos finales del intervalo.
  2. Luego, necesitamos preprocesar la excepción o salida anticipada :
    • Si arr[0] >= s y arr[n-1] <= t, significa que toda la tabla de secuencia está en el intervalo [s, t] y debemos vaciar la tabla de secuencia.
    • Si arr[0]> t o arr[n-1] <s, significa que toda la tabla de secuencia no tiene intersección con el intervalo [s, t], y necesitamos introducir un algoritmo en este momento.
  3. Además, en otros casos existe una intersección entre la tabla lineal y el intervalo [s, t]. Podemos usar el algoritmo de doble puntero para establecer dos variables de puntero a la izquierda y a la derecha para registrar respectivamente el primer elemento en el intervalo [s, t] y el primer elemento que sale del intervalo [s, t] en la tabla de secuencia. Luego intercambie los elementos donde se encuentran los dos punteros y mueva todos los elementos en el intervalo [s, t] al final de la tabla de secuencia.
  4. Finalmente, elimine los elementos en el intervalo [s, t] al final de la tabla de secuencia para completar los requisitos del tema.

Código

int LinearList::Question_04(int s, int t)
{
    
    
    if(arr.length <= 0)//顺序表为空
        return -1;
    else if(arr.data[0] > t || arr.data[arr.length-1] < s){
    
    //顺序表与区间[s,t]无交集
        return -1;
    }
    else if(arr.data[0] >= s && arr.data[arr.length-1] <= t){
    
    //整个顺序表处于区间[s,t]内
        arr.length = 0;
        return 0;
    }
    int del = 0;//记录处于区间[s,t]内的元素个数
    int i = 0,j = arr.length-1;
    int temp = 0;
    while(i < j){
    
    
        if(arr.data[i] < s)
            i++;
        if(arr.data[j] <= t){
    
    
            del ++;
            j--;
        }

        if(arr.data[i] >= s && arr.data[j] > t){
    
    
            del ++;
            temp = arr.data[i];
            arr.data[i++] = arr.data[j];
            arr.data[j--] = temp;
        }
    }
    cout<<"del:"<<del<<endl;
    arr.length -= del;
    return 0;
}

Efecto

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/wddkxg/article/details/131593675
Recomendado
Clasificación