P8824 [传智杯 #3 初赛] 终端 题解

· · 题解

蒟蒻的第一篇黄题题解,博客食用效果更佳。

update on 2024/10/17 修复了代码的两处问题

题目传送门

直接按题意模拟即可,这里采用字符串数组。

下面是分段代码:

1. 当操作为 touch,加入文件。

cin>>b;
bool f=1;
for(int i=1;i<cnt;i++){
    if(c[i]==b){//特判有没有出现过
        f=0;
        break;
    }
}
if(f==1)c[cnt]=b,cnt++;

2. 当操作为 rm,查找并删除文件,找到了就跳出循环。

cin>>b;
for(int i=1;i<cnt;i++){
    if(c[i]==b){//找到了
        c[i]="";//删除操作
        break;//跳
    }
}

3. 当操作为 rename,查找并替换文件,找到了就跳出循环。

cin>>b>>temp;
bool flag=0;
for(int i=1;i<cnt;i++){
    if(c[i]==temp){//看这次修改是否会导致重名
        flag=1;
        break;
    }
}
if(flag==0){
    for(int i=1;i<cnt;i++){
        if(c[i]==b){//修改
            c[i]=temp;
            break;
        }
    }
}

4. 当操作为 ls,遍历,如果没被删就输出。

for(int i=1;i<cnt;i++){
    if(c[i]!=""){//还没被删
        cout<<c[i]<<'\n';//输出,记得换行
    }
}

代码注释:

a 为输入的操作名,btemp 为输入的文件名,c 为文件名的数组。

另外需要注意的是循环遍历的结束条件为 i 小于 cnt,题面中第三种情况的操作名是 ls 而不是 1s

AC code:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
string a,b,c[1010];
int cnt=1,n;
int main(){
    cin>>n;
    while(n--){
        cin>>a;
        if(a=="touch"){
            cin>>b;
            c[cnt]=b;
            cnt++;
        }
        else if(a=="rm"){
            cin>>b;
            for(int i=1;i<cnt;i++){
                if(c[i]==b){
                    c[i]="";
                    break;
                }
            }
        }
        else if(a=="rename"){
            string temp;
            cin>>b>>temp;
            for(int i=1;i<cnt;i++){
                if(c[i]==b){
                    c[i]=temp;
                    break;
                }
            }
        }
        else if(a=="ls"){
            for(int i=1;i<cnt;i++){
                if(c[i]!=""){
                    cout<<c[i]<<'\n';
                }
            }
        }
    }
    return 0;
}

感谢观看!