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



  • 相关阅读:
    PHP学习之路(六)
    PHP学习之路(五)
    PHP学习之路(四)
    PHP学习之路(三)
    PHP学习之路(二)
    PHP学习之路(一)
    webstrom运行出现404的解决办法
    适配移动端Swiper的3D旋转木马轮播~
    为什么觉得英文字体设计比中文字体设计来的好看?
    linux 部署系统通过SecureCRT启动tomcat 控制台中文乱码
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3766907.html
Copyright © 2011-2022 走看看