最近看了下安卓相关的面试题,看到了一个n个人报数退出的问题就自己写了下,写完后有百度了下发现和别人的思路不一样就将自己的代码贴出来了。
主要的思路见下图:
我相信只要大家吧自己的思路理清楚了,代码实现就简单了。
以下给出代码:
public class Test {
public static void main(String[] args) {
int lastName = getLastName(8);
System.out.println(lastName);
}
public static int getLastName(int num) {
List<Integer> aa = new ArrayList<>();
for (int i = 1; i <= num; i++) {
aa.add(i);
}
return getLastName(aa);
}
static ArrayList<Integer> newList;
public static int getLastName(List<Integer> numList) {
if (numList.size()>=3) {
newList = new ArrayList<>(); //创建新的集合 存储变动后的数据
for (int i = 0; i < numList.size(); i++) {
if (i==2) {
if (numList.size()==3) {
newList.add(numList.get(0));
newList.add(numList.get(1));
} else {
for (int j = 3; j < numList.size(); j++) {
newList.add(numList.get(j)); //保证顺序的 准确性 先添加当前退出后面的数据 因为下一个退出后面的那个人第一报数
}
newList.add(numList.get(i-2)); //保证顺序的 准确性 再添加第一个和第二个数据
newList.add(numList.get(i-1));
}
}
}
return getLastName(newList); //递归
} else {
if (newList==null) {
return 2;
} else {
return newList.get(1);
}
}
}
}
看下输出结果:
当然只是简单的一种实现方式,仅供参考!