前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。
1) 初始状态下所有的发动机都是未启动状态;
2)发动机起动的方式分为“手动启动”和“关联启动”两种方式;
3)如果在时刻1一个发动机被启动,下一个时刻2与之相邻的两个发动机就会被“关联启动”;
4)如果准备启动某个发动机时,它已经被启动了,则什么都不用做;
5) 发动机0与发动机N-1是相邻;
地球联合政府准备挑选某些发动机在某些时刻进行“手动启动”,当然最终所有的发动机都会被启动。 哪些发动机最晚被启动呢?
输入
第一行两个数字N和E,中间有空格 N代表部署发动机的总个数,E代表计划手动启动的发动机总个数。
1<N<=1000,1<=E<=1000,E<=N
接下来共E行,每行都是两个数字T和P,中间有空格
T代表发动机的手动启动时刻,P代表此发动机的位置编号。 0<=T<=N,0<=P<=N
输出
第一行一个数字N,以回车结束 N代表最后被启动的发动机个数
第二行N个数字,中间有空格,以回车结束
解题思路
- 使用一维数组记录发动机的启动时间设置,没有设置的设置为-1;
- 找出最早启动的时间,以此为基点向两侧启动,并设置启动时间,然后找出下一个启动时间点的引擎进行启动,以此类推。
- 找出数组中最大的启动时间即为最后启动的引擎所对应的启动时间,输出引擎编号。
题解
Java实现
package huawei.e100;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月9日
*
*/
public class T04 {
public static boolean isNotDone(int[] engines) {
return Arrays.stream(engines).anyMatch(n -> n == -1);
}
public static void run(int[] engines, int time, int engineNum){
while (isNotDone(engines)) {
for (int i = 0; i < engineNum; i++) {
if (engines[i] == time) {
int left = i==0? (engineNum -1) : (i-1);
int right = i==(engineNum -1)? 0 : (i+1);
engines[left] = engines[left] == -1? (time +1): engines[left];
engines[right] = engines[right] == -1? (time +1): engines[right];
}
}
time +=1;
}
System.out.println(Arrays.toString(engines));
int lastEnginesNum = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < engineNum; i++) {
if (engines[i] == time) {
lastEnginesNum += 1;
sb.append(i + " ");
}
}
System.out.println(lastEnginesNum);
System.out.println(sb.toString());
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int engineNum = sc.nextInt();
int menuOpNum = sc.nextInt();
int[] engines = new int[engineNum];
Arrays.fill(engines, -1);
int minTime = engineNum;
for (int i = 0; i< menuOpNum; i++) {
int t = sc.nextInt();
int p = sc.nextInt();
engines[p] = t;
minTime = Math.min(t, minTime);
}
run(engines, minTime, engineNum);
}
}