You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

火车预订与取消系统Python代码问题求助:重复座位与取消异常

火车预订与取消系统Python问题解决方案

问题1:多座位预订时出现重复座位号

问题描述

单座位预订功能正常,但多座位预订时偶尔生成重复座位号。需求为多座位预订时先随机选一个起始座位,后续座位按+1分配以保证乘客相邻(如家庭乘客)。

核心原因

  • 随机选择起始座位时,未校验连续N个座位是否全部可用,导致选中的起始位后续存在已预订座位
  • 分配过程中未做原子化存储,分多次写入文件时可能引发资源竞争,导致重复分配

解决方案(基于OOP与文件IO优化)

  1. 先校验连续座位可用性
    • 从文件读取已预订座位并转为整数集合,利用集合的O(1)查询效率快速判断座位状态
    • 随机生成起始座位后,检查该起始位开始的连续N个座位是否都未被预订
    • 若不可用则重新随机,直到找到符合条件的连续座位段
  2. 原子化更新存储
    • 确认连续座位可用后,一次性将所有座位号写入文件,避免分批次操作的冲突
class Train:
    def __init__(self, total_seats):
        self.total_seats = total_seats
        self.booked_seats = self._load_booked_seats()

    def _load_booked_seats(self):
        # 从文件读取已预订座位,转为整数集合
        try:
            with open('booked_seats.txt', 'r') as f:
                return set(map(int, f.read().splitlines()))
        except FileNotFoundError:
            return set()

    def _save_booked_seats(self):
        # 原子化写入已预订座位
        with open('booked_seats.txt', 'w') as f:
            f.write('\n'.join(map(str, sorted(self.booked_seats))))

    def book_multiple_seats(self, num_seats):
        available = self.total_seats - len(self.booked_seats)
        if num_seats <= 0 or num_seats > available:
            return None  # 参数无效或座位不足

        import random
        while True:
            # 确保起始座位后有足够的连续座位
            start_seat = random.randint(1, self.total_seats - num_seats + 1)
            required_seats = set(range(start_seat, start_seat + num_seats))
            # 检查连续座位是否全部未被预订
            if required_seats.isdisjoint(self.booked_seats):
                self.booked_seats.update(required_seats)
                self._save_booked_seats()
                return list(required_seats)

问题2:取消座位时误删包含目标数字的其他座位

问题描述

取消特定座位号(如'1')时,会误删包含该数字的其他座位(如'10'、'11'),需仅删除目标座位号的独立实例。

核心原因

  • 处理座位号时使用了字符串包含匹配(如if target in seat_str),而非精确相等判断
  • 文件中存储的座位号未统一类型(如混合字符串与整数),导致匹配逻辑出错

解决方案(精确匹配优化)

  1. 统一座位号类型:将文件中的座位号全部转为整数,避免字符串模糊匹配
  2. 精确相等判断:取消时仅删除与目标座位号完全相等的项
class Train:
    # 继承上述__init__、_load_booked_seats、_save_booked_seats方法

    def cancel_seat(self, target_seat):
        try:
            # 转为整数确保精确匹配
            target = int(target_seat)
            if target in self.booked_seats:
                self.booked_seats.remove(target)
                self._save_booked_seats()
                return True  # 取消成功
            return False  # 目标座位未被预订
        except ValueError:
            return False  # 输入的座位号格式无效

内容的提问来源于stack exchange,提问作者Abhiroop Bhattacharjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:01:12