文章目录
- 题目一
- 思路分析
- 代码实现
- 效果
题目一
从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素,若s或t不合理或者线性表为空,则显示错误信息并退出运行。
思路分析
- 首先,题目给出数据结构为有序顺序表,故要查找区间[s,t]内的值,只需确定区间两个端点值的所在位置。
- 然后,我们要先对异常或者提前退出情况进行预处理:
- 若arr[0] >= s且arr[n-1] <= t,则说明整个顺序表处于区间[s,t]内,此时我们需要将顺序表置空。
- 若arr[0] > t或者arr[n-1] < s,则说明整个顺序表与区间[s,t]没有交集,此时我们需要推出算法。
- 此外,其他情况线性表和区间[s,t]都存在交集。我们可以利用双指针算法,设置两个指针变量left和right分别记录顺序表中处于区间[s,t]的第一个元素和第一个离开区间[s,t]的元素。再交换两个指针所在元素,将区间[s,t]内的元素全部移动到顺序表后端。
- 最后,删除顺序表的后端处于区间[s,t]中的元素,即可完成题目要求。
代码实现
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;
}