1、题目描述
疫情期间需要大家保证一定的社交距离,公司组织开交流会议。
座位一排共 N 个座位,编号分别为 [0, N - 1] , 要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。
满足:
每当一个员工进入时,需要坐到最大社交距离(最大化自己和其他人的距离的座位);
如果有多个这样的座位,则坐到索引最小的那个座位。
2、输入描述
会议室座位总数 seatNum 。(1 <= seatNum <= 500)
员工的进出顺序 seatOrLeave 数组,元素值为 1,表示进场;元素值为负数,表示出场(特殊:位置 0 的员工不会离开)。
例如 - 4 表示坐在位置 4 的员工离开(保证有员工坐在该座位上)
3、输出描述
最后进来员工,他会坐在第几个位置,如果位置已满,则输出 - 1 。
用例:
输入
10
[1,1,1,1,-4,1]
输出
5
说明
第一次坐在了0的位置 1 0 0 0 0 0 0 0 0 0
第二次坐在了9的位置 1 0 0 0 0 0 0 0 0 1
第三次坐在了4的位置 1 0 0 0 1 0 0 0 0 1
第四次坐在了2的位置 1 0 1 0 1 0 0 0 0 1
第五次4的位置离开了 1 0 1 0 0 0 0 0 0 1
第六次坐在了5的位置 1 0 1 0 0 1 0 0 0 1
温馨提示!!!
华为OD机试考试官方会对考生代码查重。华为od机试因为有题库所以有很大的概率抽到原题。如果碰到了题库中的原题,千万不要直接使用题解中的代码,一定要做些修改,比如代码中的变量名,除此之外,代码的组织结构和逻辑也要进行一些改变,所以在日常的刷题中,要提前编写好属于自己的代码。
4、题解
第一个进来的选0号位,第二个选最后一个位置,之后每次选择距离最大的两个1的位置然后取中间位置,如果有多个,则取索引小的那个位置,通过遍历已经坐过的位置sitArr,获取两个1的最远距离,再通过折半取值,获取中间值
代码如下
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 会议室座位总数
int seatNum = Integer.parseInt(sc.nextLine());
String str = sc.nextLine();
int[] seatOrLeave = Arrays.stream(str.substring(1, str.length() - 1).split(","))
.mapToInt(Integer::parseInt).toArray();
int result = getLastIndex(seatOrLeave, seatNum);
System.out.println(result);
}
private static int getLastIndex(int[] arr, int n) {
// 一个员工,则直接0号位置
if (arr.length == 1) {
return 0;
}
// 两个员工,则最后一个员工n-1号位置
if (arr.length == 2) {
return n-1;
}
// 记录占用的位置
Set<Integer> set = new TreeSet<>();
for (int i=0; i<arr.length; i++) {
// 小于0则删除对应的位置
if (arr[i] < 0) {
set.remove(-arr[i]);
continue;
}
// 已占用的位置总数
int count = set.size();
// 位置都没有占用则第一个选0位置
if (count == 0) {
set.add(0);
}else if (count == 1) {
// 第二个则选n-1号位置
set.add(n-1);
}else if (count > 1 && count < n) {
// 获取占用的位置
int[] seatedArr = new int[count];
int p = 0;
for (Integer item : set) {
seatedArr[p++] = item;
}
// 记录当前距离最大的两个位置的差
int maxDis = 0;
int left = 0;
for (int j=0; j<seatedArr.length-1; j++) {
int dis = seatedArr[j+1] - seatedArr[j];
if (dis / 2 > maxDis) {
maxDis = dis / 2;
left = seatedArr[j];
}
}
// 当前员工占用的位置
set.add(left + maxDis);
// 如果是最后一个员工则返回其占用的位置
if (i == arr.length-1) {
return left + maxDis;
}
}else if (count == n) {
// 满位置时则返回-1
return -1;
}
}
return -1;
}
执行结果如下: