约瑟夫环
第1题:由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续 从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序。
![](//img-blog.csdn.net/20140415212013234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hlZXBtdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
解法一:笨蛋解法
package com.sheepmu.text; import java.util.Arrays; /* 由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数, * 直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序 * 思路:最简单的约瑟夫环,数组实现! * 出局的数放在新数组,并把该出局的数置为-1,i++并把j又从1开始;每次都整个遍历原数组,遇到-1时i加而j不加。 * @author sheepmu */ public class RingText { public static void main(String[] args){ int m=10; int n=3; long time0=System.currentTimeMillis(); int[] result=chuQuan(m,n); long time1=System.currentTimeMillis(); System.out.println(Arrays.toString(result));//[3, 6, 9, 2, 7, 1, 8, 5, 10, 4] System.out.println("耗费时间"+(time1-time0)); } public static int[] chuQuan(int m,int n){ int[] arr_yuan=new int[m]; for(int i=0;i<m;i++) arr_yuan[i]=i+1;//原数组每人用1-10表示; int[] arr_new=new int[m];//新数组,存放依次出来的人 int left=m;//用来标识结束循环。 int i=0;//原数组。。 int j=1;//要删除的。。。 int k=0;//新数组初始下标。 while(left>0){ if(arr_yuan[i%m]>0){// !!!!!!!!!!!!!i%m的作用在于当i=m-1,即读到最后一个数时,继续读下一个,即第0个!! if(j==n){ arr_new[k++]=arr_yuan[i%m]; arr_yuan[i%m]=-1; left--; i++; j=1; } else{ i++; j++; } } else{//为-1时只是i加而j不加。 i++; } } return arr_new; } }
解法二:使用链表!!!!!!!!!!
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /* * @author sheepmu */ public class Test{ public static void main(String[] args){ int m=10; int n=3; String result=chuQuan(m,n); System.out.println("出圈顺序---->"+result ); } public static String chuQuan(int m,int n){ List<Integer>list=new ArrayList<Integer>(); for(int i=0;i<m;i++) list.add(i+1); System.out.println("list---->"+list ); StringBuffer sb=new StringBuffer(); //写法一:!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // int begin=0;//可以定义希望开始的下标!!! // while(list.size()>1){ // int del=(begin+n-1)%list.size();//要删除的下标!%list.size()可以实现环的效果 // sb.append(list.get(del)+" "); // list.remove(del); // begin=del; // } //写法二 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // int del=0; // while(list.size()>1){ // del=(del+n-1)%list.size(); // sb.append(list.get(del)+" "); // list.remove(del ); // } //写法三 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! int del=-1; while(list.size()>1){ del=(del+n)%list.size(); sb.append(list.get(del)+" "); list.remove(del-- ); } return sb.toString(); } }