面试的时候碰到这道题,后来百度了一下感觉答案不对,而且也比较缺少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; } }