也谈约瑟夫环,请指正


import java.util.ArrayList;
import java.util.List;

public class Josephus {
//约瑟夫环的算法
public static void main(String[] args) {
int result;
int temp;
List list=new ArrayList();
//初始的N
if(args[0]==null) args[0]="0";
//初始的上限值M
if(args[1]==null) args[1]="0";
int n=Integer.parseInt(args[0]);
int m=Integer.parseInt(args[1]);
//将N个数计入队列
for(int i=1;i<=n;i++){
Integer ii=new Integer(i);
list.add(ii);
}
while(list.size()>1){
int size=list.size();
temp=m;
//不到一轮,出数
if(size>=temp){
result=temp;
m=Integer.parseInt(list.get(result-1).toString());
System.out.println(list.get(result-1));
list.remove(result-1);
size--;
}else{//多于一轮,出数
result=m%size;
if(result==0) result=size;
m=Integer.parseInt(list.get(result-1).toString());
System.out.println(list.get(result-1));
list.remove(result-1);
size--;
}
//出数后组成新的队列覆盖前队列
List templist=new ArrayList();
for(int jj=result-1;jj<list.size();jj++){
templist.add(list.get(jj));
}
for(int ii=0;ii<result-1;ii++){
templist.add(list.get(ii));
}
list=templist;
//System.out.println(list);
}
System.out.println("The last one is:--"+list.get(0));
}
}


个人认为效率极差,因为要重新生成环的list,先想出个结果吧,然后再优化下!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值