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

如何处理俱乐部志愿二维数组:元素超上限时转至下一列

志愿分配系统高效实现方案

核心需求梳理

  • 输入:N行3列的志愿数组,每行对应1个申请者的第一、第二、第三志愿
  • 规则:每个俱乐部有固定名额上限(如7),当目标俱乐部名额已满时,将申请者的志愿向下切换一档(第一→第二→第三)
  • 特殊要求:优先统计已处理申请者的第二/第三志愿占用的名额,再处理后续申请者的第一志愿
  • 输出:处理后数组的第一列转置结果(即所有申请者最终调整后的第一志愿列)

高效实现思路

采用字典实时跟踪俱乐部名额的方式,所有查询、更新操作均为O(1)复杂度,整体时间复杂度为O(N)(N为申请者数量),适合大规模数据处理。以下提供两种符合需求的实现:

实现1:按申请者顺序逐个处理(常规志愿逻辑)

逐个处理每个申请者,优先尝试其第一志愿,名额满则切换至第二/第三志愿,实时更新俱乐部名额:

from collections import defaultdict

def process_volunteers(volunteers, quota=7):
    club_counts = defaultdict(int)  # 跟踪每个俱乐部已占用名额
    adjusted_volunteers = []       # 存储每个申请者调整后的志愿列表

    for vol in volunteers:
        adjusted = vol.copy()
        # 尝试第一志愿
        if club_counts[vol[0]] < quota:
            club_counts[vol[0]] += 1
        # 第一志愿满额,切换至第二志愿
        elif club_counts[vol[1]] < quota:
            club_counts[vol[1]] += 1
            adjusted[0] = vol[1]  # 第一列替换为第二志愿
            adjusted[1] = vol[2]  # 第二列替换为第三志愿
        # 第二志愿满额,切换至第三志愿
        elif club_counts[vol[2]] < quota:
            club_counts[vol[2]] += 1
            adjusted[0] = vol[2]  # 第一列替换为第三志愿
            adjusted[1] = vol[2]
        
        adjusted_volunteers.append(adjusted)
    
    # 提取处理后第一列的转置结果
    first_column_result = [row[0] for row in adjusted_volunteers]
    return first_column_result

实现2:优先处理第二/第三志愿(符合特殊要求)

先批量处理所有申请者的第二、第三志愿,占满名额后再处理第一志愿,严格遵循“优先统计第二/第三志愿”的要求:

from collections import defaultdict

def process_volunteers_prioritize_low(volunteers, quota=7):
    club_counts = defaultdict(int)

    # 第一步:先分配所有第二志愿的名额
    for vol in volunteers:
        if club_counts[vol[1]] < quota:
            club_counts[vol[1]] += 1
    # 第二步:再分配所有第三志愿的名额
    for vol in volunteers:
        if club_counts[vol[2]] < quota:
            club_counts[vol[2]] += 1
    # 第三步:处理第一志愿,剩余名额分配
    adjusted_volunteers = []
    for vol in volunteers:
        adjusted = vol.copy()
        if club_counts[vol[0]] < quota:
            club_counts[vol[0]] += 1
        elif club_counts[vol[1]] < quota:
            club_counts[vol[1]] += 1
            adjusted[0] = vol[1]
            adjusted[1] = vol[2]
        elif club_counts[vol[2]] < quota:
            club_counts[vol[2]] += 1
            adjusted[0] = vol[2]
        
        adjusted_volunteers.append(adjusted)
    
    first_column_result = [row[0] for row in adjusted_volunteers]
    return first_column_result

使用示例

# 测试输入:5个申请者的志愿数组
test_volunteers = [
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 3]
]

# 调用函数,配额设为3
result = process_volunteers(test_volunteers, quota=3)
print(result)  # 输出:[1,1,1,2,2]

内容的提问来源于stack exchange,提问作者Ammar Aldabbagh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:55:17