问题描述
试题编号: | 201703-2 |
试题名称: | 学生排队 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列。 输入格式 输入的第一行包含一个整数n,表示学生的数量,学生的学号由1到n编号。 输出格式 输出一行,包含n个整数,相邻两个整数之间由一个空格分隔,表示最终从前向后所有学生的学号。 样例输入 8 样例输出 1 2 4 3 5 8 6 7 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移动均合法。
|
-----------------------------------------------------------------------------------------------
代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
/*
这道题跟2017/12 的第二题游戏题类似,用集合求解,最为简单!
*/
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
//把序号添加到集合中
for (int x = 1; x <= n; x++) {
list.add(x);
}
//执行次数
int count = in.nextInt();
for (int x = 0; x < count; x++) {
int p = in.nextInt();
int q = in.nextInt();
add(list, p, q);
}
//迭代集合
for (Integer i : list) {
System.out.print(i + " ");
}
}
public static void add(List<Integer> list, int p, int q) {
//首先,可以获取p序号在list中的位置
int flag = list.indexOf(p);
if (q > 0) {
list.add(flag + q + 1, p);//这里+1是因为要插入到flag+q的后面一个位置
} else if (q < 0) {
list.add(flag + q, p);//上面是+1,这里会是-1吗?不是的,因为flag+q向左移动q位后,插入的数刚好会在flag+q的前一个位置
}
if (q > 0) {
list.remove(flag);//向后移动q位,要删除的数是在前面,直接删除标记flag位置的数就OK
} else if (q < 0) {
flag = flag + 1;//向前移动的话,要删除的数是在后面,因为在前面多插进去了一个数,使得list的长度多了个1,所以删除后面的位置数的话得+1
list.remove(flag);
}
}
}