7-34 约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号a,b,c…分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入格式:
固定为2行,第一行为m,第二行为n个人的名称列表,用英文字母代表
元素直接使用英文逗号 "," 分开
输出格式:
一行,为出列元素序列,元素之间使用英文逗号 , 分开【注意:末尾元素后没有逗号】
输入样例:
3
a,b,c,d,e,f,g
输出样例:
c,f,b,g,e,a,d
代码如下
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
String mes = input.next();
String[]arr = mes.split(",");//分割
//创建列表,保存arr内容,便于后续操作
LinkedList<String> list = new LinkedList<String>();
for(int i=0;i<arr.length;i++) {
list.add(arr[i]);
}
int count = 0;//计数,当count ==num-1,就进行一次删除
//这里不在循环最后增加i++,是防止删除操作后i的位置自增
//这样可以使其从删除的下一个的位置开始(类似双指针)
for (int i = 0; i < list.size(); ) {
//控制“,”的输出
if(list.size()==1) {
System.out.println(list.getFirst());
break;
}
//进行删除操作
if(count == num-1) {
System.out.print(list.get(i)+",");
list.remove(i);
count = 0;
}else {count++;i++;}
//当i遍历到列表的最后一位时,重置i的值,使其从列表的第一个元素开始
if(i==list.size())
i=0;
}
input.close();
}
}