方法一:利用链表来实现,时间复杂度为O(n^2),空进复杂度为O(n)
public class Test {
//n个小朋友,给定数 m
public static int LuckyOne(int n,int m){
LinkedList<Integer> list = new LinkedList<Integer>();
for(int i=0;i<n;i++){
list.add(i);
}
int index = 0;
while (n>1){
index = (index + m - 1) % n;
list.remove(index);
n--;
}
if(n==1){
return list.getFirst();
}
return -1;
}
public static void main(String[] args) {
int n = LuckyOne(12,3);
System.out.println(n); //9
}
}
方法二:递归实现 , 时间复杂度为O(n),空进复杂度为O(n)
public class Test {
public static int Lucky_one(int n , int m){
if(n<=0){
return -1;
}
if(n==1){
return 0;
}
int num = Lucky_one(n-1,m);
return (num + m) % n;
}
public static void main(String[] args) {
int n = Lucky_one(12,3);
System.out.println(n);
}
}