最近发现,约瑟夫环的笔试出镜率还挺高,总结一个时间复杂度为O(n),空间复杂度为O(n)的解法:
例题:0,1,2,·······,n-1,这n个数字排成一个圆圈,从0开始,每次删除第m个数字,输出每一次删除的数字。
代码如下:
import java.util.ArrayList;
public class JosephCircle {
public static void main(String[] args){
int n = 5;
int m = 3;
deleteResult(n,m);
}
static void deleteResult(int n, int m){
ArrayList<Integer> arlist = new ArrayList<>();
for(int i = 0; i < n; i++){
arlist.add(i);
}
int k = 0;
while(!arlist.isEmpty()){
k = (k+ m -1) % n;
System.out.print(arlist.remove(k) +" ");
n = n -1;
}
}
}
解释说明:
使用一个ArrayList
类型变量arlist
存储n
个数字,定义一个变量k
,每次求k = (k+m-1) % n
的值(由于每次从当前数开始计算,因此需要减一,同时,由于是个环,因此需要取模)。之后输出list.remove(k)
,删除一个数后数字个数减小 n = n-1
,当list
为空时,结束循环。