1. 题目
读题
今年7月份迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
输入描述:
输入2个正整数,空格分隔,第一个代表人数N,第二个代表M:
输出描述:
输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序:
示例1
输入
6 3
输出
3 6 4 2 5 1
说明
6个人排成一排,原始位置编号即为1-6。最终输出3 6 4 2 5 1表示的是原来编号为3的第一个出列,编号为1的最后一个出列。
考查点
2. 解法
思路
代码逻辑
具体实现
public class CountOff {
public static void main(String[] args) {
System.out.println(Arrays.toString(count(6, 3)));
System.out.println(Arrays.toString(count(15, 3)));
}
public static int[] count(int m, int n) {
int seq = 0;
int[] people = new int[m];
int[] res = new int[m];
int cnt = 0;
while (seq < m) {
for (int i = 0; i < m; i++) {
if (people[i] == 0) {
cnt++;
if (cnt % n == 0) {
people[i] = 1;
res[seq++] = i + 1;
}
}
}
}
return res;
}
}
运行结果
[3, 6, 4, 2, 5, 1]
[3, 6, 9, 12, 15, 4, 8, 13, 2, 10, 1, 11, 7, 14, 5]