面试的时候碰到这道题,后来百度了一下感觉答案不对,而且也比较缺少java版本。就自己写了下。
题目描述:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3的人退出圈子。问问第k个退出的人 的编号
解题思路:
1)若k大于人的个数,肯定是没有返回值的,我们把这个返回值定为-1;
2)可以考虑用一个list存储起来,每次到了编号为3的就把他移出去,然后接着往后继续往后。对于list有一个要处理的是,因为这是一个环,所以循环到最后的话需要把下边又到0重新开始。
代码:
import java.util.ArrayList;
public class Main_2 {
public static void main(String args[]){
int n=10;
ArrayList<Integer>list=new ArrayList<>();
//只是用一个list来存每个人的编号。
for(int i=0;i<n;i++){
list.add(i+1);
}
int k=10;
System.out.println(method(list,k));;
}
public static int method( ArrayList<Integer> list,int k){
int count=0;
int num=0;
for(int j=0;j<list.size();j++){
num++;
if(num==3){
//每次都是1-2-3,到了3之后,令num=0,下次又可以1-2-3
num=0;
count++;
//判断count=k。如果是,直接返回,不是就移掉这个数继续往后
if(count==k){
return list.get(j);
}
list.remove(j);
//这边有一个需要注意的是,如果移掉了当前,原本的j+1就到了j,如果j不减的话,就会直接漏掉那个数
//所以这边j--
j--;
}
//如果到了尾部,下一次又会到0;所以这边j=-1,j++刚好j等于0
if(j==list.size()-1){
j=-1;
}
}
//没有取到,返回-1
return -1;
}
}
本文介绍了一种使用Java编程语言解决约瑟夫环问题的方法。通过运用ArrayList存储人员编号,实现每三个人中淘汰一人的逻辑,直到找到第k个被淘汰的人的编号。文章详细阐述了解题思路及具体实现代码。
2880

被折叠的 条评论
为什么被折叠?



