ShuangChenYue ShuangChenYue
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
  • 网络

  • 操作系统

  • 数据结构

  • 算法

    • 两数之和
    • 回文数
    • 最长公共前缀
    • 三数之和
    • 删除有序数组中的重复项
    • 最大子数组和
    • x 的平方根
    • 爬楼梯
    • 对称二叉树
    • 二叉树的最大深度
    • LCR寻找文件副本
    • 买卖股票的最佳时机
    • LCR图书整理 II
    • 只出现一次的数字
    • LCR 训练计划 II
    • 环形链表
    • LRU 缓存
    • 反转字符串中的单词
    • LCR 破冰游戏
      • 题目:
      • 示例:
      • 解题:
        • 方法一:迭代法
    • 反转链表
    • 翻转二叉树
    • 回文链表
    • 移动零
    • 最长回文串
    • 汉明距离
    • 把二叉搜索树转换为累加树
    • 最短无序连续子数组
    • 合并二叉树
    • 二分查找
    • 链表的中间结点
    • 有序数组的平方
    • 找到小镇的法官
  • Linux

  • 计算机基础
  • 算法
霜晨月
2023-12-28
目录

LCR 破冰游戏

# LCR 187. 破冰游戏 (opens new window)

# 题目:

社团共有 num 为成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。

# 示例:

示例 1:

输入:num = 7, target = 4
输出:1
1
2

示例 2:

输入:num = 12, target = 5
输出:0
1
2

提示:

  • 1 <= num <= 10^5
  • 1 <= target <= 10^6

# 解题:

# 方法一:迭代法

这是一个经典的约瑟夫环问题。可以使用递归或迭代来解决。

思路:

  1. 这种解法使用迭代的方式模拟约瑟夫环的过程。假设删除的位置为 last,当前数组长度为 n。

  2. 初始时,我们设置 last = 0,表示从 0 号位置开始。然后,我们循环从 2 号位置(数组长度为2)到 n 号位置(数组长度为 n),更新 last 的位置。

  3. 具体的更新公式是 last = (last + m) % i,其中 i 表示当前的数组长度。

  4. 这个公式的意义是,每次删除一个数字后,我们从下一个数字开始重新计数,并在新的数组长度下更新当前位置。

  5. 最终,留下的 last 就是游戏结束时最后一位成员的编号。

last = (last + m) % i是怎么来的?

这个更新公式是模拟在当前数组长度为 i 时,每次删除一个数字后,下一个数字的位置。

让我们逐步解释这个公式:

  • last: 表示当前删除数字的位置。
  • m: 表示社长抽取的数字 target。
  • i: 表示当前成员数组的长度。

每次删除一个数字后,我们从下一个数字开始重新计数。为了找到下一个数字的位置,我们将当前位置 last 加上 m,表示我们向后移动了 m 个位置。然后,我们取这个移动后的位置对当前数组长度 i 取模,确保我们不越界。这样,得到的新的 last 就是下一轮的起始位置。

这个操作模拟了游戏中的计数过程,每次删除一个数字后,从下一个数字重新开始计数。这个公式在约瑟夫环的问题中经常用到。

class Solution {
public:
    int lastRemaining(int n, int m) {
        int last = 0;
        for (int i = 2; i <= n; i++) {
            last = (last + m) % i;
        }
        return last;
    }
};
/*
 在这个算法中,i 表示当前的成员数量。
 循环从 i = 2 开始,是因为对于 i = 1 的情况,即只有一个成员的情况,这个成员就是最后留下的,无需进行循环计算。
 因此,从 i = 2 开始,依次计算每次抽取一个成员后剩余成员的最后一个留下的编号。
*/ 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

复杂度:

  • 时间复杂度是 O(n)
  • 空间复杂度是 O(1)
上次更新: 2024/6/3 14:54:44
反转字符串中的单词
反转链表

← 反转字符串中的单词 反转链表→

Theme by Vdoing | Copyright © 2023-2024 霜晨月
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式