• 【ccf-csp题解】第7次csp认证-第三题-路径解析超详细题解-字符串模拟


    本题思路来源于acwing ccfcsp认证

    题目描述

    思路分析

    首先,为了处理路径中的反斜杠符号,我们可以实现一个get函数,把一个路径中每一对反斜杠之间的内容存到vector中,如果有连续的多个反斜杠则只看成一个

    举个例子:

    路径为:/d1/d2/d3  可以变为:vectorpath;其中path[0]=="d1" path[1]=="d2" path[2]=="d3"

    路径为:/d1//d2//d3/ 也可以变为:跟上面一样的path

    如何实现这个函数呢?直接遍历即可:

    1. vectorget(string str)
    2. {
    3. vectorres;
    4. for(int i=0;isize();i++)
    5. {
    6. if(str[i]=='/')continue;
    7. int j=i+1;
    8. while(jsize()&&str[j]!='/')j++;//包含遍历结束和遇到下一个'/'两种情况
    9. res.push_back(str.substr(i,j-i));
    10. }
    11. return res;
    12. }

    对于给出的当前目录,我们就可以直接把其转换为vector类型的cur了

    紧接着,我们会输入n个样例,需要注意的是,样例有可能为空串(此时答案就会输出当前目录)

    如果依然用cin,就会忽略这个空串,所以我们用getline

    既然使用了getline,我们就需要在之前的cin后面加一个getchar()吸收回车

    接下来,我们看如何处理样例

    第一步依然是把输入的string用get函数进行路径拆分编程vector类型的path,然后需要去判断这个path是绝对路径还是相对路径,只需要看第一个字符是不是'/'(当然还需要空串特判,这个就不多说了)

    我们再实现一个函数:void walk(vectorcur,vectorpath)

    这个函数可以在cur的基础上把后面的path(可能包含"."和"..")添加进来,同时输出最终结果

    如果是空串或者是相对路径,我们这样调用walk:

    walk(cur,path);

    如果是空串的话,path就是空,就会输出cur的路径形式

    否则,就是输出把path加到cur之后的cur的路径形式

    如果是绝对路径,我们这样调用walk:

    walk(ab,path);

    其中ab是空的vector

    最后我们看,如何实现walk函数

    利用cpp的foreach写法,直接遍历path中每一个字符串:

    如果是"."直接continue

    如果是"..",如果cur是空,则continue(因为根目录的上一级还是根目录),否则就删掉一个cur中的string

    如果是其它,直接把这个字符串push_back到cur的后面

    最后,如果cur是空,输出"/",return 即可

    否则,foreach遍历cur,每次输出一个string之前,别忘加一个'/'哦

    一百昏代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int n;
    6. string str;
    7. vectorget(string str)
    8. {
    9. vectorres;
    10. for(int i=0;isize();i++)
    11. {
    12. if(str[i]=='/')continue;
    13. int j=i+1;
    14. while(jsize()&&str[j]!='/')j++;
    15. res.push_back(str.substr(i,j-i));
    16. i=j;
    17. }
    18. return res;
    19. }
    20. void walk(vectorcur,vectorpath)
    21. {
    22. for(auto p:path)
    23. {
    24. if(p==".")continue;
    25. else if(p=="..")
    26. {
    27. if(cur.size())cur.pop_back();
    28. }
    29. else
    30. cur.push_back(p);
    31. }
    32. if(cur.empty())
    33. {
    34. puts("/");
    35. return;
    36. }
    37. for(auto p:cur)
    38. cout<<"/"<
    39. cout<
    40. }
    41. int main()
    42. {
    43. cin>>n>>str;
    44. vectorcur=get(str);
    45. vectorab;
    46. getchar();
    47. while(n--)
    48. {
    49. string examp;
    50. getline(cin,examp);//因为有可能有空串,所有不用cin
    51. vectorpath=get(examp);
    52. if(examp.size()&&examp[0]=='/')walk(ab,path);
    53. else walk(cur,path);
    54. }
    55. return 0;
    56. }

  • 相关阅读:
    2022年全球市场砷化铟镓引脚模块总体规模、主要生产商、主要地区、产品和应用细分研究报告
    前端性能优化:网站性能优化
    R语言GLM广义线性模型:逻辑回归、泊松回归拟合小鼠临床试验数据(剂量和反应)示例和自测题
    rabbitmq下载安装教程
    基于PHP的人才招聘网站设计
    使用 Vue 3 插件(Plugin)实现 OIDC 登录和修改密码(OIDC 系统以 Keycloak 为例)
    Partition架构
    C# 调用外部EXE程序,接收exe传递的参数,python打包成exe文件
    1.[人脸识别] python采集摄像头视频
    angular知识系列:移除library
  • 原文地址:https://blog.csdn.net/m0_63222058/article/details/133764032