今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
输入2个正整数,空格分隔,第一个代表人数N,第二个代表M:
输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序:
6 3
3 6 4 2 5 1
6个人排成一排,原始位置编号即为1-6。最终输出3 6 4 2 5 1表示的是原来编号为3的第一个出列,编号为1的最后一个出列。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int key = sc.nextInt();
sc.close();
int[] orderNo = getOrderNo(n, key);
String s = "";
for (int i = 0; i < orderNo.length; i++) {
s += orderNo[i] + " ";
}
System.out.println(s);
}
public static int[] getOrderNo(int n, int key) {
List<Integer> list = new ArrayList<>(n); // 构建链表
for (int i = 0; i < n; i++) list.add(i + 1);
int[] order = new int[n]; // 构建输出序列
int next = 0; // 指针的下一个位置
int count = 0; // 报数
int flag = 0; // 输出序列的下标
while (list.size() != 0) {
count++;
if (count % key == 0) {
Integer remove = list.remove(next);
order[flag++] = remove.intValue();
} else {
next = (next + 1) % list.size();
}
}
return order;
}
}