基于巴士座位编号判断座位类型的C#高效算法实现
巴士座位类型查询的C#高效实现
座位排布参考
W M S | S M W 01 02 03 | 19 20 21 04 05 06 | 22 23 24 07 08 09 | 25 26 27 10 11 12 | 28 29 30 13 14 15 | 31 32 33 16 17 18 | 34 35 36
需求:输入1-36之间的座位编号,返回对应的座位类型(W/M/S),例如输入26返回M。
最快实现方式:两种O(1)方案
方案1:预定义字典映射(极致查询速度)
直接用字典存储所有座位编号与类型的映射,初始化一次后查询是O(1)时间复杂度,适合高频查询场景:
// 全局静态字典,仅初始化一次 private static readonly Dictionary<int, char> _seatTypeMap = new Dictionary<int, char> { // 左侧区域(1-18) {1, 'W'}, {2, 'M'}, {3, 'S'}, {4, 'W'}, {5, 'M'}, {6, 'S'}, {7, 'W'}, {8, 'M'}, {9, 'S'}, {10, 'W'}, {11, 'M'}, {12, 'S'}, {13, 'W'}, {14, 'M'}, {15, 'S'}, {16, 'W'}, {17, 'M'}, {18, 'S'}, // 右侧区域(19-36) {19, 'S'}, {20, 'M'}, {21, 'W'}, {22, 'S'}, {23, 'M'}, {24, 'W'}, {25, 'S'}, {26, 'M'}, {27, 'W'}, {28, 'S'}, {29, 'M'}, {30, 'W'}, {31, 'S'}, {32, 'M'}, {33, 'W'}, {34, 'S'}, {35, 'M'}, {36, 'W'} }; /// <summary> /// 获取座位对应的类型 /// </summary> /// <param name="seatNumber">1-36之间的座位编号</param> /// <returns>W/M/S</returns> /// <exception cref="ArgumentOutOfRangeException">座位编号超出范围时抛出</exception> public static char GetSeatType(int seatNumber) { if (seatNumber is < 1 or > 36) throw new ArgumentOutOfRangeException(nameof(seatNumber), "座位编号必须在1-36范围内"); return _seatTypeMap[seatNumber]; }
方案2:数学计算(无额外内存占用)
通过取模运算计算座位在排内的位置,再映射类型,同样是O(1)时间复杂度,适合内存敏感场景:
/// <summary> /// 获取座位对应的类型 /// </summary> /// <param name="seatNumber">1-36之间的座位编号</param> /// <returns>W/M/S</returns> /// <exception cref="ArgumentOutOfRangeException">座位编号超出范围时抛出</exception> public static char GetSeatType(int seatNumber) { if (seatNumber is < 1 or > 36) throw new ArgumentOutOfRangeException(nameof(seatNumber), "座位编号必须在1-36范围内"); int posInRow; if (seatNumber <= 18) { // 左侧每排3个座位:位置1=W,2=M,3=S posInRow = (seatNumber - 1) % 3 + 1; return posInRow switch { 1 => 'W', 2 => 'M', 3 => 'S', _ => throw new InvalidOperationException("无效的座位位置") }; } else { // 右侧每排3个座位:位置1=S,2=M,3=W posInRow = (seatNumber - 19) % 3 + 1; return posInRow switch { 1 => 'S', 2 => 'M', 3 => 'W', _ => throw new InvalidOperationException("无效的座位位置") }; } }
方案对比
- 字典映射:查询速度最快,因为直接键值对匹配,适合频繁查询的场景,仅需一次初始化开销。
- 数学计算:无需额外内存存储映射关系,计算逻辑简单,适合内存有限的场景。
两种方案都是O(1)时间复杂度,属于当前需求下的最优实现。
内容的提问来源于stack exchange,提问作者Rushee
相关产品推荐
相关产品推荐

