题目描述
有一个初始长度为0的数列,三种操作
1.将某一个元素插入
2.将某一个元素删除
3.查询当前状态
输入
第一个数字m表示有m个操作
后面m行表示m个操作
每行输入一个数字op
如果op=1表示第一个操作,后面接着两个数字a,b表示在第a个位置插入b(a以及a后的数字后移)
如果op=2表示第二个操作,后面接着一个数字a表示删除第a数字
如果op=3表示第三个操作,查询当前数列的状态
(m<=1000,操作保证合法)
输出
对于每一个op=3输出当前数列的状态
样例输入
3
1 1 3
1 2 4
3
样例输出
3 4

简单模拟题

方法一:vector:第一次看到这个题目的时候,本能的想到用vector,动态数组的功能十分强大,而且十分的便捷,但是在写代码的过程中,编译器崩溃了,不能输入……,这里就是我又忽略的一点,vector储存的时候是在下标为0的时候开始储存的,所以我们需要在当前位置(不管删除还是增加)都要减一,不然会出现不明错误,减去1之后就顺利的AC了

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main()
{
    int m, op;
    scanf("%d", &m);
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d", &op);
        if (op == 1)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            v.insert(v.begin() + a - 1, b);
        }
        else if (op == 2)
        {
            int x;
            scanf("%d", &x);
            v.erase(v.begin() + x - 1);
        }
        else if (op == 3)
        {
            for (int i = 0; i < v.size(); ++i)
                if (i == 0)
                    printf("%d", v[i]);
                else
                    printf(" %d", v[i]);
            puts("");
        }
    }
    return 0;
}

方法二:数组模拟:数组模拟最大的弱点就是:在数据很小的时候就可以通过,但是数组模拟不失为一种好方法,在我们想不到其他办法的时候,数组模拟就成为了我们最后一条路,此刻想到高中数学老师的一句话,如果我们想不出题解,永远有一条路在等着我们那就是求导,同样我把这句话送给后来者,虽然我知道我这一句话可能不对,但是我还是想说,如果想不到好的算法那就模拟吧!

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int ans[maxn];
int main()
{
    int op, m, now = 0;
    scanf("%d", &m);
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d", &op);
        if (op == 1)
        {
            ++now;
            int a, b;
            scanf("%d%d", &a, &b);
            for (int i = now; i > a; --i)
                ans[i] = ans[i - 1];
            ans[a] = b;
        }
        else if (op == 2)
        {
            int x;
            scanf("%d", &x);
            for (int i = x; i < now; ++i)
                ans[i] = ans[i + 1];
            --now;
        }
        else if (op == 3)
        {
            for (int i = 1; i <= now; ++i)
                printf("%d%c", ans[i], i == now ? '\n' : ' ');
        }
    }
    return 0;
}

方法三:链表
由于我数据结构的课在划水,所以并没有学号链表,加上之前学习C语言的时候没有去专研指针,所以目前这一块我是打算放弃了,代码的话就偷偷附上大佬的代码吧(有懒不偷***)后序有其他题解的话我都想好说辞了,(梅开二度),(帽子戏法)……

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5 + 5;
const int inf = 0x3f3f3f3f;
struct node
{ //链表节点结构体
    int v;
    node *nex;
};
void cout_(node *head)
{                          //循环输出链表的值
    node *now = head->nex; //第一个元素是head的nex(head是不存东西的)
    while (now != NULL)
    { //循环输出,直到链表末尾
        printf("%d", now->v);
        now = now->nex;
        if (now != NULL)
        {
            printf(" ");
        }
    }
    printf("\n");
}
int main()
{
    int n, m, op, a, b;
    node *head = (node *)malloc(sizeof(node)); //给头结点指针分配内存
    head->nex = NULL;
    scanf("%d", &m);
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d", &op);
        if (op == 1)
        {
            scanf("%d %d", &a, &b);
            a--;
            node *now = head;
            while (a--)
            { //找到插入位置的前一个元素
                now = now->nex;
            }
            node *ne = (node *)malloc(sizeof(node));
            //链表插入
            ne->v = b;
            ne->nex = now->nex;
            now->nex = ne;
        }
        else if (op == 2)
        {
            scanf("%d", &a);
            a--;
            node *now = head;
            while (a--)
            { //找到删除位置的前一个元素
                now = now->nex;
            }
            //链表删除
            node *p = now->nex;
            now->nex = p->nex;
            free(p);
        }
        else
        {
            //输出链表数据
            cout_(head);
        }
    }
    return 0;
}
想要一个东西就去买,喜欢一个人就去追,哪怕到最后那个东西没有用,喜欢的人也没有追到。都没关系,人生苦短,及时行乐,你要明白,遗憾比失败可怕的多。