小苯的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;
}

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

相关推荐
CoovallyAIHub7 小时前
NAN-DETR:集中式噪声机制如何让检测更“团结”?
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
火箭工程大学多模态遥感检测新框架MROD-YOLO:如何将小目标检测精度提升至77.9%?
深度学习·算法·计算机视觉
steins_甲乙7 小时前
C++并发编程
开发语言·c++
CoovallyAIHub7 小时前
未来物体检测趋势:需要关注的 7 个关键问题
深度学习·算法·计算机视觉
业精于勤的牙7 小时前
小张刷题计划(二)
数据结构·算法
谈笑也风生7 小时前
期望个数统计(二)
算法
hans汉斯7 小时前
【人工智能与机器人研究】人工智能算法伦理风险的适应性治理研究——基于浙江实践与欧美经验的整合框架
大数据·人工智能·算法·机器人·数据安全·算法伦理·制度保障
CoderYanger8 小时前
动态规划算法-两个数组的dp(含字符串数组):42.不相交的线
java·算法·leetcode·动态规划·1024程序员节
亮子AI9 小时前
【Tiptap】如何使用 ordered list?
数据结构·list·tiptap
南莺莺9 小时前
二叉排序树的创建和基本操作---C++实现
数据结构·c++·算法··二叉排序树