约瑟夫环

第1题:由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续              从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序。

解法一:笨蛋解法

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();
	 }
}	 



posted @ 2014-03-23 21:31  IT专业户  阅读(209)  评论(0编辑  收藏  举报