Python程序员面试算法宝典---解题总结: 第5章 5.22 如何求相对路径

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第5章 5.22 如何求相对路径

题目:
编写一个函数,根据两个文件的绝对路径计算出其相对路径。
例如
a="/qihoo/app/a/b/c/d/new.c",
b="/qihoo/app/1/2/test.c"
那么b相对于a的;就是
"../../../../1/2/test.c"

分析:
最简单的方式先找到两个路径的最长前缀公共路径
然后对路径a用/划分,划分得到的列表长度-1即为
'../'应该出现的次数,再拼接上b中除最长前缀
公共路径剩余的部分

关键:

参考:
Python程序员面试算法宝典
'''

"""
计算需要在相对路径前面添加的"../"
的个数,和字符串b剩余的内容
"""
def getRelatedNumAndRemainedStr(a, b):
    if not a or not b:
        return ""
    aList = a.split("/")
    bList = b.split("/")
    aLen = len(aList)
    bLen = len(bList)
    size = min(aLen, bLen)
    for i in range(size):
        if aList[i] != bList[i]:
            break
    # 接下来计算 "../"的个数,现在i表示的是第一次两者不同的位置,
    # 也是相同元素的个数
    relatedNum = aLen - i - 1
    remained = "/".join(bList[i:])
    return relatedNum, remained


def getRelatedPath(a, b):
    if not a or not b:
        return ""
    relatedNum, remained = getRelatedNumAndRemainedStr(a, b)
    related = ""
    for i in range(relatedNum):
        related += "../"
    result = related + remained
    return result


def process():
    a = "/qihoo/app/a/b/c/d/new.c"
    b = "/qihoo/app/1/2/test.c"
    result = getRelatedPath(a, b)
    print result


if __name__ == "__main__":
    process()

 

你可能感兴趣的:(Python程序员面试算法宝典)