今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
import java.io.*;
import java.util.*;
/**
*
时间限制:1秒 空间限制:32768K
今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
输入描述:
输入2个正整数,空格分隔,第一个代表人数N,第二个代表M:
输出描述:
输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序:
输入例子1:
6 3
输出例子1:
3 6 4 2 5 1
例子说明1:
6个人排成一排,原始位置编号即为1-6。最终输出3 6 4 2 5 1表示的是原来编号为3的第一个出列,编号为1的最后一个出列。
*/
//运行时间: 140 ms 占用内存:14236K 使用SpringBuilder存储输出值
//运行时间: 170 ms 占用内存:15100K 使用Springbuffer存储输出值
//运行时间: 184 ms 占用内存:15180K 使用arraylist存储输出值(多一步转为string之后删除中括号与逗号的步骤)
public class StudentId {
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) {
// TODO Write your code here
int count = 0;//存储上一个分配到学号的位置
int input1 = input[1];//
int input0 = input[0];//
List<Integer> list = new ArrayList<>();
StringBuilder result = new StringBuilder();
//List<Integer> keyList = new ArrayList<>();
for(int e=1;e<=input0;e++){
list.add(e);
}
for(int i=1;list.size()>0;i++){
if(i%input1==0){
result.append(list.remove(count)+" ");
}else {
count++;
}
if(count>=list.size()){
count-=list.size();
}
}
//String result = keyList.toString();
/*result=result.replaceAll("\\[","").replaceAll("\\[","");
result=result.replaceAll("]","").replaceAll("]","");
result=result.replaceAll(",","").replaceAll(",","");*/
return result.toString();
}
}
第一次写的没用list存储列表remove的方法,要多加一个判断是否存在的循环,结果用时过长。使用String类型存储输出结果,耗时长达七百多毫秒。
此题为约瑟夫问题又称丢手绢问题。