【算法集训之线性表篇】Day 03

该文章描述了一个算法问题,涉及从有序顺序表中删除值在s和t之间的所有元素。首先检查输入的s和t是否合理以及顺序表是否为空,然后使用双指针方法找到区间边界,交换元素并将目标区间元素移到表后端,最后删除这些元素。代码实现中包含了异常处理和删除元素的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目一

从有序顺序表中删除其值在给定值s和t之间(要求s<t)的所有元素,若s或t不合理或者线性表为空,则显示错误信息并退出运行。

思路分析

  1. 首先,题目给出数据结构为有序顺序表,故要查找区间[s,t]内的值,只需确定区间两个端点值的所在位置。
  2. 然后,我们要先对异常或者提前退出情况进行预处理
    • 若arr[0] >= s且arr[n-1] <= t,则说明整个顺序表处于区间[s,t]内,此时我们需要将顺序表置空。
    • 若arr[0] > t或者arr[n-1] < s,则说明整个顺序表与区间[s,t]没有交集,此时我们需要推出算法。
  3. 此外,其他情况线性表和区间[s,t]都存在交集。我们可以利用双指针算法,设置两个指针变量left和right分别记录顺序表中处于区间[s,t]的第一个元素和第一个离开区间[s,t]的元素。再交换两个指针所在元素,将区间[s,t]内的元素全部移动到顺序表后端。
  4. 最后,删除顺序表的后端处于区间[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;
}

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛狂的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值