代码题记录之地铁线处理【2】

111 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

大家好 我是短袖撸码蒂尔尼。今天带来的是一道python的题目,来自之前我的一个朋友的课程作业,在他提交完作业之后,我搞到了原题,题目难度不大。但我好久没做过这种题目了,就在此为大家分享一下解答思路。

前文回顾

代码题记录之地铁线处理【1】

题目阐述

今天我们来看一下第四道题目:

image.png

image.png

image.png

思路阐述

其实找站点和找线路的大体方向是没有什么变化的,只不过这次是需要在找到线路的基础上进行筛选,然后打印出一条符合要求的路线。

由于需要计算路线上的距离用作比较行程,因此新建类StationDistance

class StationDistance:
    def __init__(self, name, o, d):
        self.name = name
        self.o = o
        self.d = d
        self.distance = o + d

    def getDistance(self):
        return self.distance

    def getDistanceFromOrigin(self):
        return self.o

    def getName(self):
        return self.name

    def compare(self, a):
        if self.getDistance() > a.getDistance():
            return a
        elif self.getDistance() == a.getDistance():
            if self.getDistanceFromOrigin() > a.getDistanceFromOrigin():
                return a
            elif self.getDistanceFromOrigin() == a.getDistanceFromOrigin():
                if self.getName() > a.getName():
                    return a
        return self

这里可以看到的我,我写了一个COMPARE的方法,用作比较两个行程直接的远近。里面包含了首站点比较,站点名称字典序比较。同时还创建了用于存储StationDistance的列表类DistanceList

# list to store StationDistance
class DistanceList:
    def __init__(self):
        self.list = []

    def getList(self):
        return self.list

    def append(self, station: StationDistance):
        self.list.append(station)

    def getShortest(self):
        l = self.getList()
        res = l[0]
        for i in range(1, len(l)):
            res = res.compare(l[i])
        return res

整体思路如下:

  • 同一条线路上
    • 直接算起点和终点的距离(绝对值)
  • 中转站
    • 计算每一个起点到中转站的距离 中转站到终点的距离
    • 如果只有一个中转站 直接计算 反之: 新建类station——distance 然后在自定义类distance-list进行排序

在输出上,当站点都只在一条线路上,变化和前一篇的问题里的思路一致。 而后面其他情形的打印,思路都是直接计算距离,然后比较,方式较为直接。

elif len(l1_searchlist) + len(l2_searchlist) == 4:
    distance1 = get_distance(line1, origin, destination)
    distance2 = get_distance(line2, origin, destination)
    if distance2 < distance1:
        print_route(line2, origin, destination, True)
    else:
        print_route(line1, origin, destination, True)
else:
    interchange_stations = find_connection(line1, line2)
    if len(interchange_stations) == 0:
        print("No connection found!")
    elif l1_searchlist[0] == origin:
        DL = DistanceList()
        for station in interchange_stations:
            o = get_distance(line1, origin, station)
            d = get_distance(line2, station, destination)
            SD = StationDistance(station, o, d)
            DL.append(SD)
        res = DL.getShortest().getName()
        print_route(line1, origin, res, True)
        print("Change at %s to %s line" % (res, line2.name))
        print_route(line2, res, destination, False)
    else:
        DL = DistanceList()
        for station in interchange_stations:
            o = get_distance(line2, origin, station)
            d = get_distance(line1, station, destination)
            SD = StationDistance(station, o, d)
            DL.append(SD)
        res = DL.getShortest().getName()
        print_route(line2, origin, res, True)
        print("Change at %s to %s line" % (res, line1.name))
        print_route(line1, res, destination, False)

好了,这就是这道简单的查找地铁线路的解题思路。

我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg