题解 CF20A 【BerOS file system】

· · 题解

看了一下 还没有人用这个方法做

一看到这个题面 我就想到了replace 只要把"//" 替换成"/" 就可以把多余的"/" 消除掉了

于是有了

a = a.replace(a.find("//", 0), 2, "/");//把 //(两个字符)替换成/

但是一次肯定替换不完啊 所以

L1:
a = a.replace(a.find("//", 0), 2, "/");
if (a.find("//", 0) != string::npos)//string::npos就是找不到了
    goto L1;

但是我RE了 原因是有可能并没有"//"(题目说的是至少有一个"/")

改进后得到

L1:
    if (a.find("//", 0) == string::npos)
        goto L2;
    a = a.replace(a.find("//", 0), 2, "/");
    goto L1;
L2:

但是又WA了 发现题面还说道

路径末的/可以省略

L1:
    if (a.find("//", 0) == string::npos)
        goto L2;
    a = a.replace(a.find("//", 0), 2, "/");
    goto L1;
L2:
    if (a[a.length() - 1] == '/')
        a = a.substr(0, a.length() - 1);

然后又WA了 因为如果整个路径就一个/ 那就会被去掉

L1:
    if (a.find("//", 0) == string::npos)
        goto L2;
    a = a.replace(a.find("//", 0), 2, "/");
    goto L1;
L2:
    if (a[a.length() - 1] == '/' && a.length() != 1)//加了个判断
        a = a.substr(0, a.length() - 1);

终于AC了QAQ

最后上完整代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string a;
    cin >> a;
L1:
    if (a.find("//", 0) == string::npos)
        goto L2;
    a = a.replace(a.find("//", 0), 2, "/");
    goto L1;
L2:
    if (a[a.length() - 1] == '/' && a.length() != 1)
        a = a.substr(0, a.length() - 1);
    cout << a;
    return 0;
}