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
- 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.
- 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.
- 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.
- 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;
}