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

基于巴士座位编号判断座位类型的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:24