前两天面试,遇到了一个经典算法题。让我手写,我真的很烦,没有idea我怎么写?所以就给面试官口述了一下思路
这两天回顾了一下,用idea写了,在此分享一下。
题目:有一群人,依次循环数123,数到3的人淘汰。直到最后只剩一个人
思路就是使用递归的方式,直到最后只剩一个人,返回结果。
直接上代码:
public static void main(String[] args) {
int[] nums = new int[]{1,2,3,4};
System.out.println(lifeInt(nums,1));
}
/**
*
* @param nums 数组,用数组来存放人
* @param index 1,2,3.当最后一个人喊2的时候,会从头开始喊,但是第一个应该喊3,而不是喊1
* @return
*/
public static int lifeInt(int[] nums,int index) {
int[] temp;
//2个人且第一个不是喊1,此次循环会淘汰一个,数组长度应该设为1。但是2的三分之二上取整还是为2,所以这里需要判断一下
if (nums.length == 2&&index!=1) {
temp = new int[1];
}else {
temp = new int[(int) Math.ceil(nums.length/3.0*2.0)];
}
int tempIndex = 0; //temp数组索引
for (int i = 0; i < nums.length; i++) {
//如果是3,直接淘汰,继续下一次循环
if (index==3){
index=1;
continue;
}
index++;
temp[tempIndex++]=nums[i];
}
//递归结束条件
if (nums.length==1) return nums[0];
return lifeInt(temp,index);
}
很讨厌面试手写代码。难受!!!
如果有更优解,欢迎分享。
https://www.yuque.com/tulingzhouyu/db22bv
https://www.yuque.com/tulingzhouyu/sfx8p0/rbdxb6yzqvx59hoi