有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

来源:互联网 发布:建筑图纸设计软件 编辑:程序博客网 时间:2024/05/21 09:13

需求:

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

代码:

package work;import java.util.ArrayList;public class Main{/** * 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 *  * 要求:用集合解决问题。 *  * @param args */public static void main(String[] args) {int n = 8;// n 个人ArrayList<String> list = new ArrayList<>();for (int i = 0; i < n; i++) {list.add("Person" + i);}//观察规律// 0  1  2  3  4  5  6  7// p0 p1 p2 p3 p4 p5 p6 p7 -->2 %list.size() = 2// p0 p1 p3 p4 p5 p6 p7 -->4%lits.seze() = 4// p0 p1 p3 p4 p6 p7 -->6 %list.size() = 0// p1 p3 p4 p6 p7 -->2 %list.size() = 2// p1 p3 p6 p7 -->4 %list.size() = 0// p3 p6 p7 -->2 %list.size() = 2// p3 p6  -->4 %list.size() = 0// p6  -->剩下 6//// 根据规律发现。每次下标+2 后 对集合长度取余后 刚好是要删除的位置。int tag = 0;while (list.size() > 1) {// 当最后只剩下一个后 出圈结束tag += 2;tag %= list.size();list.remove(tag);// list.remove(tag = (tag + 2) % list.size());//等价与上面3行代码}System.out.println("最后留下的位置:"+list.get(0));// 观察最后一个留下来的人。}}


阅读全文
0 0