google code jam exercise——File Fix It
前几天一直卡在Making Chess Board那道题上,目前还没有完全解决,打算先跳过。这次是Round 1B 2010的第一道题,还算比较简单,具体如下。
在Linux系统中,创建文件夹需要使用mkdir,如果父文件夹不存在则需要先创建父文件夹,题目先给出一组已经创建的文件路径,然后给出一组需要创建的文件路径,计算最少的mkdir的次数。当然,没有使用mkdir -p。
直接的想法就是,对已经创建的路径进行hash,放入dict,所以读取一个已经创建的路径的时候,先查看整个路径是否已经在dict中,如果不在,将其添加到dict中,剥掉最后一层,继续检查路径是否在dict中,如果在,则结束。
同样地,创建给出的文件路径时,先检查整个路径,然后一层一层的剥掉。如果不存在,则mkdir加1.
用什么做dict的key呢?如何剥掉最后一层呢?
这里使用os.path.girname(path),返回path去掉最后一层的值,跟/有关,总是去掉最后一个/及其后面的字符串,到最后留下根目录/。所以一开始需要将/加入dict中。path始终是字符串,可以做dict的key。
代码如下:
#!/usr/bin/python #encoding:UTF-8 #Filename:FileFixIt.py import sys import os inname = "input.txt" outname = "output.txt" if len(sys.argv)>1: inname = sys.argv[1] outname = inname.rstrip(".in") outname = outname + ".out" fin = open(inname,"r") fout = open(outname,"w") testCaseNum = int(fin.readline().rstrip("\n")) caseNum = 0 for caseNum in xrange(1,testCaseNum+1): (createdNum,toCreateNum)=[int(val) for val in fin.readline().rstrip("\n").split()] createdDict = dict() createdDict["/"] = 1 for i in range(createdNum): line = fin.readline().rstrip("\n") while(1): if line not in createdDict: # print "not in dict",line createdDict[line] = 1 line = os.path.dirname(line) else: break mkdirCnt = 0 for i in xrange(toCreateNum): line = fin.readline().rstrip("\n") while(1): if line not in createdDict: # print "not in dict",line createdDict[line] = 1 line = os.path.dirname(line) mkdirCnt = mkdirCnt + 1 else: break answer = "Case #%d: %d\n" %(caseNum,mkdirCnt) fout.write(answer) fin.close() fout.close()
最后small和large case测试都通过了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述