欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python入门习题(81)——OpenJudge百练习题:报站

程序员文章站 2022-04-01 17:56:42
...

OpenJudge百练第4097号习题:报站

题目描述

来源
OpenJudge网站 —— 百练习题集-第4097号习题

要求
总时间限制: 3000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB

描述

北京的地铁是很便利的,几乎覆盖了北京所有的重要地点。如果我们常常坐地铁,也会 非常熟悉地铁上报站的声音。”The next station is ZhongGuanCun. Please get ready for your arrival.”。一个乘客在四号线从上车到下车,会听到一系列的车站名:BeiJingDaXueDongMen, ZhongGuanCun, HaiDianHuangZhuang…

现在需要一个程序,对于一名乘客,报出他在乘坐某号线地铁时,从上车到下车经过的 站名(包括上车的站名和下车的站名)。现在请你写一个程序,来实现这个功能。

输入
第一行 n,表示该地铁线路有 n(n<100)个地铁站。从第 2 行到第 n+1 行是有序的 n 个地铁站的站名,站名由英文字母构成,长度不会超过 100,站名不会重复。第 n+2 行为一 个整数 m(m<100),表示有 m 个乘客需要报站名。这之后 m 行,每行为一个乘客上车的站 名和下车的站名。地铁线路没有环线,但是乘客可以正向坐车,也可以反向坐车。
输出
输出 m 行,每行为每个乘客经过的站名,站名中间用空格分隔。行首或行尾不要有多 余的空格。
样例输入
10
BeiJingDaXueDongMen
ZhongGuanCun
HaiDianHuangZhuang
RenMinDaXue
WeiGongCun
GuoJiaTuShuGuan
DongWuYuan
XiZhiMen
XinJieKou
PingAnLi
2
BeiJingDaXueDongMen RenMinDaXue
GuoJiaTuShuGuan ZhongGuanCun
样例输出
BeiJingDaXueDongMen ZhongGuanCun HaiDianHuangZhuang RenMinDaXue
GuoJiaTuShuGuan WeiGongCun RenMinDaXue HaiDianHuangZhuang ZhongGuanCun

解题思路

  1. 输入n个站名,存入stations列表。
  2. 读入m个(上车站名,下车站名),存入from_to列表。
  3. 对于每一对(上车站名, 下车站名):
    (3-1)求出上车站名在stations列表的索引from_index;
    (3-2)求出下车站名在stations列表的索引to_index;
    (3-3)输出from_index到to_index之间的全部站名。
  4. 用切片操作得出from_index到to_index之间的全部站名。正向的话,增量为1,stations[from_index:to_index + 1]是所求的全部站名。反向的话,增量为-1,stations[from_index:to_index-1:-1]是所求的全部站名。要注意,to_index是0的时候,0-1=-1,stations[from_index: -1:-1]中间的-1是最后一个元素的索引,这一写法是不正确的,应改为:stations[from_index: :-1]。

参考答案

n = int(input())
stations = [input() for i in range(n)]
# print(stations)
m = int(input())
from_to = []
for i in range(m):
    f_t = input().strip().split()
    if len(f_t) != 2:
        continue
    from_to.append(f_t)
# print(from_to)
for from_station, to_station in from_to:
    if from_station not in stations or to_station not in stations:
        print()
        continue
    from_index = stations.index(from_station)
    to_index = stations.index(to_station)
    # print(from_index, to_index)
    if from_index < to_index:
        print(' '.join(stations[from_index:to_index + 1]))
    elif to_index == 0:
        print(' '.join(stations[from_index::-1]))
    else:
        print(' '.join(stations[from_index:to_index-1:-1]))

测试用例

  1. 题目描述给出的测试用例覆盖了正向的情形,也覆盖了反向的情形。
  2. 从头到尾,从尾到头。
    样例输入
    10
    BeiJingDaXueDongMen
    ZhongGuanCun
    HaiDianHuangZhuang
    RenMinDaXue
    WeiGongCun
    GuoJiaTuShuGuan
    DongWuYuan
    XiZhiMen
    XinJieKou
    PingAnLi
    2
    BeiJingDaXueDongMen PingAnLi
    PingAnLi BeiJingDaXueDongMen
    样例输出
BeiJingDaXueDongMen ZhongGuanCun HaiDianHuangZhuang RenMinDaXue WeiGongCun GuoJiaTuShuGuan DongWuYuan XiZhiMen XinJieKou PingAnLi
PingAnLi XinJieKou XiZhiMen DongWuYuan GuoJiaTuShuGuan WeiGongCun RenMinDaXue HaiDianHuangZhuang ZhongGuanCun BeiJingDaXueDongMen
  1. 上车站名等于下车站名。是不太合理,不过测一测看看,而且拿头尾站点来试一试。
    样例输入
    10
    BeiJingDaXueDongMen
    ZhongGuanCun
    HaiDianHuangZhuang
    RenMinDaXue
    WeiGongCun
    GuoJiaTuShuGuan
    DongWuYuan
    XiZhiMen
    XinJieKou
    PingAnLi
    2
    BeiJingDaXueDongMen BeiJingDaXueDongMen
    PingAnLi PingAnLi
    样例输出
    BeiJingDaXueDongMen
    PingAnLi

  2. n=1的边界情形。
    样例输入
    1
    BeiJingDaXueDongMen
    2
    BeiJingDaXueDongMen BeiJingDaXueDongMen
    BeiJingDaXueDongMen PingAnLi
    样例输出
    BeiJingDaXueDongMen

  3. n=0的边界情形。
    样例输入
    0
    1
    BeiJingDaXueDongMen BeiJingDaXueDongMen
    样例输出
    (注:输出空行)

  4. m=0的边界情形。
    样例输入
    1
    BeiJingDaXueDongMen
    0
    样例输出
    (注:没有输出)

  5. m=1的边界情形。
    样例输入
    10
    BeiJingDaXueDongMen
    ZhongGuanCun
    HaiDianHuangZhuang
    RenMinDaXue
    WeiGongCun
    GuoJiaTuShuGuan
    DongWuYuan
    XiZhiMen
    XinJieKou
    PingAnLi
    1
    BeiJingDaXueDongMen RenMinDaXue
    样例输出
    BeiJingDaXueDongMen ZhongGuanCun HaiDianHuangZhuang RenMinDaXue

小结

  1. 上一节给出的各组测试用例全都成功通过。然而,遗憾的是,参考答案一节的代码提交到OpenJudge上之后,报告“Runtime Error”。我猜测是系统验证答案正确性的过程中存在问题。
  2. 要注意,乘客可以正向坐车,也可以反向坐车。