如何编写方法根据地图开放规则查询指定日期的开放地图?
地图开放规则与查询实现方案
地图基础数据
| 地图名称 | 开放起始日 | 持续天数 |
|---|---|---|
| mapA | 8 | 3 |
| mapB | 11 | 3 |
| mapC | 15 | 3 |
| mapD | 35 | 3 |
具体开放节点
- 第1天为服务器开服日
- 第8天:mapA开放
- 第11天:mapB开放
- 第14天:mapC开放
- 第35天:mapD开放
地图切换规则
- 地图开放后持续指定天数,到期次日0点自动关闭
- 当前地图关闭时,按规则切换下一张地图:
- 优先检查按开放顺序的下一张地图是否已到开放起始日(即下一张地图的开放日 ≤ 关闭当天)
- 若已开放,直接切换至该地图
- 若未开放,则从所有已开放的地图中从头开始循环
运行示例
- 第1至7天:无可用地图,不开放任何地图
- 第8天:mapA开放,持续3天(8-10日)
- 第11天:关闭mapA,下一张mapB已开放,故开放mapB(11-13日)
- 第14天:关闭mapB,下一张mapC未开放,故从已开放地图从头开始,开放mapA(14-16日)
- 第17天:关闭mapA,开放mapB(17-19日);第20天:关闭mapB,此时mapC已开放,故开放mapC(20-22日)
问题需求
实现一个查询方法,输入任意日期即可返回当日开放的地图,核心难点是处理地图循环切换的逻辑。
编码思路
核心逻辑拆解
- 数据预处理:将地图按开放起始日从小到大排序,确保顺序正确
- 边界判断:输入日期早于第一张地图开放日时,直接返回无可用地图
- 分段跳跃计算:无需逐天模拟,通过关键节点跳跃定位:
- 先定位到目标日期所在的初始地图周期
- 若遇到新地图开放节点,直接切换;若未遇到,则计算已开放地图的循环周期,通过取余快速定位目标地图
伪代码实现
// 定义地图数组(按开放日排序) maps = [ {name: "mapA", available_time:8, last_time:3}, {name: "mapB", available_time:11, last_time:3}, {name: "mapC", available_time:15, last_time:3}, {name: "mapD", available_time:35, last_time:3} ] function getCurrentMap(day): // 边界情况:无可用地图 if day < maps[0].available_time: return "无可用地图" current_idx = 0 // 计算当前地图的结束日(包含当天) current_end = maps[current_idx].available_time + maps[current_idx].last_time - 1 // 目标日期在当前地图有效期内 if day <= current_end: return maps[current_idx].name while True: next_idx = (current_idx + 1) % len(maps) close_day = current_end + 1 // 当前地图关闭的日期(次日0点) // 检查下一张地图是否已开放 if maps[next_idx].available_time <= close_day: // 切换到下一张地图 current_idx = next_idx current_end = close_day + maps[current_idx].last_time - 1 if day <= current_end: return maps[current_idx].name else: // 筛选所有已开放的地图 active_maps = [m for m in maps if m.available_time <= close_day] cycle_total = sum(m.last_time for m in active_maps) days_remaining = day - close_day // 计算循环内的偏移,定位目标地图 offset = days_remaining % cycle_total accumulated = 0 for map in active_maps: accumulated += map.last_time if offset < accumulated: return map.name
Python代码实现
from dataclasses import dataclass from typing import Optional @dataclass class MapInfo: name: str available_time: int last_time: int # 初始化地图数据(按开放起始日排序) MAPS = [ MapInfo("mapA", 8, 3), MapInfo("mapB", 11, 3), MapInfo("mapC", 15, 3), MapInfo("mapD", 35, 3), ] def get_current_map(day: int) -> Optional[str]: # 处理无可用地图的情况 if day < MAPS[0].available_time: return None current_idx = 0 # 计算当前地图的结束日期(包含当天) current_end = MAPS[current_idx].available_time + MAPS[current_idx].last_time - 1 if day <= current_end: return MAPS[current_idx].name while True: next_idx = (current_idx + 1) % len(MAPS) close_day = current_end + 1 # 当前地图关闭的日期(次日0点) # 检查下一张地图是否已开放 if MAPS[next_idx].available_time <= close_day: current_idx = next_idx current_end = close_day + MAPS[current_idx].last_time - 1 if day <= current_end: return MAPS[current_idx].name else: # 筛选所有已开放的地图 active_maps = [m for m in MAPS if m.available_time <= close_day] cycle_total = sum(m.last_time for m in active_maps) days_remaining = day - close_day # 计算循环内的偏移,定位目标地图 offset = days_remaining % cycle_total accumulated = 0 for map in active_maps: accumulated += map.last_time if offset < accumulated: return map.name
测试验证
get_current_map(14)→ 返回mapA(符合示例)get_current_map(17)→ 返回mapBget_current_map(20)→ 返回mapCget_current_map(35)→ 返回mapDget_current_map(38)→ 返回mapA
内容的提问来源于stack exchange,提问作者Criwran
相关产品推荐
相关产品推荐

