小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

C题:C-小苯的IDE括号问题(easy)_牛客小白月赛87 (nowcoder.com)

D题: D-小苯的IDE括号问题(hard)_牛客小白月赛87 (nowcoder.com)

C题代码:

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N = 2e5+10;
int n,k;
int l[N],r[N];

//删除操作
void remove(int x)
{
    r[l[x]] = r[x];
    l[r[x]] = l[x];
}

int main()
{
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    cin >> n >> k;
    string s;
    cin >> s;
    //做一个标记头尾哨子
    s = "L" + s + "R";
    int pos = 0; //标记位置,用来去找鼠标I的位置
    for(int i=1;i<s.size();i++)
    {
        if(s[i] == 'I')
        {
            pos = i;
            break;
        }
    }
    r[0] = s.size()-1,l[s.size()-1] = 0;
    for(int i=1;i<s.size();i++)
    {
        //插入操作(插入指向左右指针)
        int left = i-1,right = r[i-1];
        l[i] = left,r[i] = right;
        l[right] = i,r[left] = i;
    }
    while(k--)
    {
        string str;
        cin >> str;
        if(str == "backspace")
        {
            if(s[l[pos]] == '(' && s[r[pos]] == ')')
            {
                remove(l[pos]);
                remove(r[pos]);
            }
            else{
                if(s[l[pos]] == 'L') continue;
                remove(l[pos]);
            }
        }
        else{
            if(s[r[pos]] == 'R') continue;
            remove(r[pos]);
        }
    }
    for(int i=r[0];i!=s.size()-1;i=r[i])
        cout << s[i];
    return 0;
}

D题代码:

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N = 2e5+10;
int l[N],r[N];
int n,k;

void remove(int x)
{
    r[l[x]] = r[x];
    l[r[x]] = l[x];
}

int main()
{
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    cin >> n >> k;
    string s;
    cin >> s;
    s = "L" + s + "R";
    int pos = 0;
    for(int i=1;i<=n;i++)
    {
        if(s[i] == 'I')
        {
            pos = i;
            break;
        }
    }
    //这里对于C题换了一种写法,两种都可以
    r[0] = s.size()-1,l[s.size()-1] = 0;
    for (int i = 1; i <=n+1 ; i++) 
        l[i] = i - 1, r[i - 1] = i;
    while(k--)
    {
        string str;
        cin >> str;
        if(str == "backspace")
        {
            if(s[l[pos]] == '(' && s[r[pos]] == ')')
            {
                remove(l[pos]);
                remove(r[pos]);
            }
            else{
                if(s[l[pos]] == 'L') continue;
                remove(l[pos]);
            }
        }
        else if(str == "delete")
        {
            //注意:这块一定要仔细读题不要落条件,不写会超时(本人的错)    
            if(s[r[pos]] == 'R') continue;
            remove(r[pos]);
        }
        else if(str == "->")
        {
            if(s[r[pos]] != 'R')
            {
                //交换只改变原数组,不改变双链表
                //删除只改变双链表,不改变原数组   
                int idx = r[pos];
                swap(s[idx],s[pos]);
                pos = idx; //一定要挪动一下pos的位置
            }
        }
        else
        {
            if(s[l[pos]]!='L')
            {
                int idx = l[pos];
                //这里交换原数组不会改变,双链表数组
                swap(s[idx],s[pos]);
                pos = idx;
            }
        }
    }
    //遍历链表
    for(int i=r[0];i!=s.size()-1; i=r[i])
        cout << s[i];
    return 0;
}

双链表 一定要多动手模拟,手动去做一下删除和插入操作,自己就会深有体会

相关推荐
m0_639906943 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
Sakura_j_h_3 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
ZhengEnCi4 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
程序喵大人4 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David5 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi5 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6185 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang5 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
jimy16 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
2601_970703837 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法