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