zoukankan      html  css  js  c++  java
  • 约瑟夫环

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



  • 相关阅读:
    03_ if 练习 _ little2big
    uva 11275 3D Triangles
    uva 12296 Pieces and Discs
    uvalive 3218 Find the Border
    uvalive 2797 Monster Trap
    uvalive 4992 Jungle Outpost
    uva 2218 Triathlon
    uvalive 3890 Most Distant Point from the Sea
    uvalive 4728 Squares
    uva 10256 The Great Divide
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3766907.html
Copyright © 2011-2022 走看看