面试的时候碰到了这道题,当时不会做
回来网上查资料发现,答案要不不对,要不太繁琐不易懂
最后还是自己研究出来写法,蛮开心的
提供给大家做一个参考
代码都做了注释,便于大家理解
有帮助的话可以点个赞,谢谢啦☀️
public static void main(String[] args) {
// 需求:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。
Scanner s = new Scanner(System.in);
System.out.print("请输入排成一圈的人数:");
// 变量n是人数
int n = s.nextInt();
// list中保存的是n个人每个人的初始位置
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(i + 1);
}
// 变量l是计数值,相当于当前报数的值
int l = 1;
// n是人数,剩最后一个人停止循环
while (n > 1) {
// 遍历list集合,每遍历一次相当于
for (int i = 0; i < list.size(); i++) {
// 当前计数值为三时,相当于报到3
if (l == 3) {
// 移除当前元素,相当于报到3人退出圈子
list.remove(i);
// 指针前移一位,相当于从当前的人继续报数
i--;
// 总人数减一
n--;
// 重置计数值,相当于下次从1重新开始报数
l = 0;
}
// 计数值加一,相当于报数
l++;
}
}
// 最后list集合中剩余的元素就是最后一个人的初始位置
System.out.println("最后留下的是原来第" + list + "号");