0
点赞
收藏
分享

微信扫一扫

每日一题(2022年4月4日)

春意暖洋洋 2022-04-04 阅读 96
c++

题目一:

你有一个序列,现在你要支持几种操作:

  • insert x y,在从前往后的第xx个元素后面插入yy这个数。如果x=0x=0,那么就在开头插入。

  • delete x,删除从前往后的第xx个元素。

  • query k,询问从前往后数第kk个元素是多少。

做法一(链表)

#include<bits/stdc++.h>
using namespace std;
​
struct{
    int value;
    int next,pre;
}node[1005];//创建链表结点
​
int head,tail,tot;
​
void init(){//链表初始化
    tot = 2;
    head = 1;tail=1;//定义链表表头和尾巴。该链表表头仅起到标记的作用,无value值
    node[head].next=tail;
}
​
void insert( int p,int val){
    int q = ++tot; //新增结点
    node[q].value = val;
    node[q].next = node[p].next;
    node[node[p].next].pre = q;
    node[p].next = q;
    node[q].pre = p;
}
​
void delet(int p){
    node[node[p].pre].next = node[p].next;
    node[node[p].next].pre = node[p].pre;
}
​
int main(){
    int m;cin >> m;
    while(m--){
        string op;cin >> op;
        if(op == "insert"){
            int x,y;cin >> x >> y;//在第x个元素后插入y,若x为0,则删改表头
            int i = head;
            while(x--)
                i = node[i].next;
            insert(i,y);
        }
        if(op == "query"){
            int x;cin >> x;//查询第x个元素
            int i = head;
            while(x--)//检索第x个元素对于的下标
                i = node[i].next;
            cout << node[i].value << endl;
​
        }
        if(op == "delete"){
            int p;cin >> p;//删除第p个元素
            int i = head;
            while(p--)//检索第p个元素对于的索引(下标)
                i = node[i].next;
            delet(i);
        }
    }
}

STL做法

#include<bits/stdc++.h>
using namespace std;
​
vector<int> k;
string op;
int m;
​
int main(){
    cin >> m;
     while(m--){
        string op;
        cin >> op;
        if(op == "insert"){
            int x,y;cin >> x >> y;
            k.insert(k.begin()+x,y);//插入
        }
        if(op == "query"){
            int x;in >> x;
            cout << k[x-1] << endl;
        }
        if(op == "delete"){
            int p;cin >> p;
            k.erase(k.begin()+p-1);//删除
        }
    }
​
}

题目描述

输入格式

        第一行一个整数nn,接下来一行nn个整数,表示出栈序列。

输出格式

        输出2n2n行,每行一个push xpop的操作,可以发现一个出现序列对应的操作序列是唯一的。

题解一 – 模拟出栈入栈

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(auto i = a; i <= b; i++)
​
int n;
int a[100005];
stack<int> p;
​
int main(){
    cin >> n;
    rep(i,1,n) cin >> a[i];
    int cnt = 1;
    rep(i,1,n){
        p.push(i);
        printf("push %d\n",i);
        while(!p.empty() && p.top() == a[cnt]){
            p.pop();
            cnt++;
            puts("pop");
        }
    }
​
}

题解二 –更短更简练

#include<bits/stdc++.h>
using namespace std;
​
int main()
{
    int n,x;
    cin>>n;
    int now=1;
    for(int i = 1;i <= n;i++)
    {
        scanf("%d",&x);//cin输入如果不解绑h
        while(now <= x) printf("push %d\n",now++);
        puts("pop");
    }
    return 0;
}
举报

相关推荐

0 条评论