题目
N个人(N < 10000)从 1 开始依次编号,从第一个人开始报数,每次数到编号为 m 的倍数人就出列(已出列的人不参与后面的报数),然后下一个人接着报数,如果已经是最后一个人了,那么第一个人接着最后一个人的数接着往下报,直到所有的人都出列
代码
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Welcome to vivo !
*/
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputStr = br.readLine();
int input[] = parseInts(inputStr.split(" "));
String output = solution(input);
System.out.println(output);
}
private static int[] parseInts(String[] strArr) {
if (strArr == null || strArr.length == 0) {
return new int[0];
}
int[] intArr = new int[strArr.length];
for (int i = 0; i < intArr.length; i++) {
intArr[i] = Integer.parseInt(strArr[i]);
}
return intArr;
}
private static String solution(int[] input) {
int renShu = input[0];
int m = input[1];
if (renShu == 0 || renShu > 10000) {
return null;
}
if (renShu == 1) {
return "1";
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < renShu; i++) {
list.add(i + 1);
}
int bianLiCiShu = 0;
String res = "";
// 3 6 4 2 5 1
while (list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
if ((bianLiCiShu + 1) % m == 0) {
res = res + list.get(i) + " ";
list.remove(i);
i--;
if (i + 1 == list.size()) {
i = -1;
}
bianLiCiShu++;
} else {
bianLiCiShu++;
}
}
}
return res;
}
}