当前位置: 面试刷题>> 询问冷却时间 (经典算法题500道)


**题目描述补充**: "码小课网站正在设计一个在线游戏系统,其中每个玩家在使用特定技能后需要等待一段时间(即冷却时间)才能再次使用该技能。系统需要记录每个玩家每个技能的最后使用时间,并在玩家尝试再次使用该技能时检查是否已经过了冷却时间。如果过了冷却时间,则允许使用并更新该技能的最后使用时间;如果未过冷却时间,则返回错误信息提示玩家还需等待多久。 请设计并实现一个函数,该函数接受玩家ID、技能ID和当前时间戳作为参数,返回是否允许使用技能以及如果不允许,还需要等待多久(以秒为单位)的信息。假设每个技能的冷却时间是固定的,且所有时间戳都是UNIX时间戳(整数类型)。" **示例代码实现**: ### PHP 示例 ```php cooldowns[$key])) { // 如果没有记录,说明技能刚被使用或从未使用,允许使用并更新时间 $this->cooldowns[$key] = $currentTime; return ['canUse' => true, 'waitTime' => 0]; } $lastUsedTime = $this->cooldowns[$key]; $elapsedTime = $currentTime - $lastUsedTime; if ($elapsedTime >= $cooldownSeconds) { // 如果已过冷却时间,允许使用并更新时间 $this->cooldowns[$key] = $currentTime; return ['canUse' => true, 'waitTime' => 0]; } else { // 如果未过冷却时间,返回还需等待的时间 return ['canUse' => false, 'waitTime' => $cooldownSeconds - $elapsedTime]; } } } // 使用示例 $manager = new SkillCooldownManager(); $result = $manager->canUseSkill(1, 1, time(), 10); // 假设当前时间是UNIX时间戳,技能冷却时间为10秒 print_r($result); ?> ``` ### Python 示例 ```python class SkillCooldownManager: def __init__(self): self.cooldowns = {} def can_use_skill(self, player_id, skill_id, current_time, cooldown_seconds): key = f"{player_id}-{skill_id}" if key not in self.cooldowns: # 如果没有记录,则允许使用并更新时间 self.cooldowns[key] = current_time return True, 0 last_used_time = self.cooldowns[key] elapsed_time = current_time - last_used_time if elapsed_time >= cooldown_seconds: # 如果已过冷却时间,允许使用并更新时间 self.cooldowns[key] = current_time return True, 0 else: # 如果未过冷却时间,返回还需等待的时间 return False, cooldown_seconds - elapsed_time # 使用示例 manager = SkillCooldownManager() result = manager.can_use_skill(1, 1, int(time.time()), 10) # 假设当前时间是UNIX时间戳,技能冷却时间为10秒 print(result) ``` **注意**: Python 示例中使用了 `time.time()` 来获取当前时间戳,并需要导入 `time` 模块(`import time`)。 ### JavaScript 示例 ```javascript class SkillCooldownManager { constructor() { this.cooldowns = {}; } canUseSkill(playerId, skillId, currentTime, cooldownSeconds) { const key = `${playerId}-${skillId}`; if (!(key in this.cooldowns)) { // 如果没有记录,则允许使用并更新时间 this.cooldowns[key] = currentTime; return { canUse: true, waitTime: 0 }; } const lastUsedTime = this.cooldowns[key]; const elapsedTime = currentTime - lastUsedTime; if (elapsedTime >= cooldownSeconds) { // 如果已过冷却时间,允许使用并更新时间 this.cooldowns[key] = currentTime; return { canUse: true, waitTime: 0 }; } else { // 如果未过冷却时间,返回还需等待的时间 return { canUse: false, waitTime: cooldownSeconds - elapsedTime }; } } } // 使用示例 const manager = new SkillCooldownManager(); const currentTime = Date.now() / 1000; // JavaScript中的Date.now()返回毫秒,需要转换为秒 const result = manager.canUseSkill(1, 1, currentTime, 10); // 假设当前时间是UNIX时间戳,技能冷却时间为10秒 console.log(result); ``` 以上代码示例均实现了题目要求的功能,并给出了如何使用这些类的示例。
推荐面试题