一、题目描述100个人围成一圈每个人有一个编码编号从1开始到100。他们从1开始依次报数报到为M的人自动退出圈圈然后下一个人接着从1开始报数直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少二、输入输出描述输入描述整数M。输出描述按照原先的编号从小到大的顺序以英文逗号分割输出编号字符串如果输入参数M小于等于1或者大于等于100输出ERROR!三、示例输入3输出58,91说明输入M为3最后剩下两个人。输入4输出34,45,97说明输入M为4最后剩下三个人。四、解题思路1. 核心思想使用链表 迭代器模拟循环报数淘汰过程遍历节点时动态删除被淘汰的人直到剩余人数M最后排序输出结果。2. 问题本质分析这是一个循环报数删除问题约瑟夫环对象1~100 连续编号规则循环报数报到 M 淘汰停止条件剩余人数 M输出剩余编号从小到大本质循环遍历 动态删除 结果排序3. 核心逻辑输入校验M 必须是 2~99否则报错链表存储用 LinkedList 存 1~100方便删除迭代器遍历支持循环遍历 中途删除节点报数淘汰每报数到 M删除当前人计数器归零停止条件链表大小M 时停止淘汰排序输出剩余编号升序逗号拼接4. 步骤拆解输入与校验读取 M不在 2~99 直接输出 ERROR初始化数据生成 1~100 编号存入 LinkedList循环淘汰迭代器遍历逐个报数报到 M 就删除计数器归零直到人数M 停止结果处理剩余编号升序排序拼接成逗号分隔格式输出字符串五、代码实现import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int M sc.nextInt(); // 非法判断 if (M 1 || M 100) { System.out.println(ERROR!); return; } // 初始化 1~100 编号 LinkedListInteger list new LinkedList(); for (int i 1; i 100; i) { list.add(i); } int count 0; // 当前报数 // 剩余人数 M 就继续淘汰 while (list.size() M) { ListIteratorInteger it list.listIterator(); while (it.hasNext() list.size() M) { it.next(); count; // 报到 M 就删除 if (count M) { it.remove(); count 0; // 下一个从 1 开始 } } } // 排序题目要求按编号从小到大输出 Collections.sort(list); // 输出格式拼接 StringBuilder sb new StringBuilder(); for (int num : list) { sb.append(num).append(,); } if (sb.length() 0) { sb.deleteCharAt(sb.length() - 1); } System.out.println(sb); } }
报数游戏问题
一、题目描述100个人围成一圈每个人有一个编码编号从1开始到100。他们从1开始依次报数报到为M的人自动退出圈圈然后下一个人接着从1开始报数直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少二、输入输出描述输入描述整数M。输出描述按照原先的编号从小到大的顺序以英文逗号分割输出编号字符串如果输入参数M小于等于1或者大于等于100输出ERROR!三、示例输入3输出58,91说明输入M为3最后剩下两个人。输入4输出34,45,97说明输入M为4最后剩下三个人。四、解题思路1. 核心思想使用链表 迭代器模拟循环报数淘汰过程遍历节点时动态删除被淘汰的人直到剩余人数M最后排序输出结果。2. 问题本质分析这是一个循环报数删除问题约瑟夫环对象1~100 连续编号规则循环报数报到 M 淘汰停止条件剩余人数 M输出剩余编号从小到大本质循环遍历 动态删除 结果排序3. 核心逻辑输入校验M 必须是 2~99否则报错链表存储用 LinkedList 存 1~100方便删除迭代器遍历支持循环遍历 中途删除节点报数淘汰每报数到 M删除当前人计数器归零停止条件链表大小M 时停止淘汰排序输出剩余编号升序逗号拼接4. 步骤拆解输入与校验读取 M不在 2~99 直接输出 ERROR初始化数据生成 1~100 编号存入 LinkedList循环淘汰迭代器遍历逐个报数报到 M 就删除计数器归零直到人数M 停止结果处理剩余编号升序排序拼接成逗号分隔格式输出字符串五、代码实现import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int M sc.nextInt(); // 非法判断 if (M 1 || M 100) { System.out.println(ERROR!); return; } // 初始化 1~100 编号 LinkedListInteger list new LinkedList(); for (int i 1; i 100; i) { list.add(i); } int count 0; // 当前报数 // 剩余人数 M 就继续淘汰 while (list.size() M) { ListIteratorInteger it list.listIterator(); while (it.hasNext() list.size() M) { it.next(); count; // 报到 M 就删除 if (count M) { it.remove(); count 0; // 下一个从 1 开始 } } } // 排序题目要求按编号从小到大输出 Collections.sort(list); // 输出格式拼接 StringBuilder sb new StringBuilder(); for (int num : list) { sb.append(num).append(,); } if (sb.length() 0) { sb.deleteCharAt(sb.length() - 1); } System.out.println(sb); } }