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测试都通过了。

 

原文地址:https://www.cnblogs.com/Frandy/p/google_code_jam_file_fix_it_python.html