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

     

  • 相关阅读:
    UML学习——用例图(二)
    servlet相关生命周期(二)
    UML 学习——UML概述(一)
    servlet概述(一)
    java 核心编程——线程之线程控制(五)
    java 核心编程——线程之线程池(ExecutorService)(四)
    java 核心编程——线程之线程组(四)
    java 核心编程——线程之定时器(TimerTask)(三)
    java 核心编程——线程之线程的开发方法(二)
    java 核心编程——线程之线程的基本概念(一)
  • 原文地址:https://www.cnblogs.com/Frandy/p/google_code_jam_file_fix_it_python.html
Copyright © 2020-2023  润新知