leetcode
leetcode 1201 ~ 1250
红绿灯路口

红绿灯路口

难度:

标签:

题目描述

代码结果

运行时间: 38 ms, 内存: 17.4 MB


/*
 * Leetcode Problem 1279: Traffic Light Controlled Intersection
 *
 * Problem Statement:
 * There is an intersection with a traffic light. The traffic light can be in one of three states: green, yellow, or red. Given a series of cars arriving at the intersection,
 * each with an arrival time and direction, implement a system that controls the traffic light to avoid collisions and ensure cars proceed safely.
 *
 * Approach using Java Streams:
 * 1. Use a blocking queue to manage car arrivals and traffic light state changes.
 * 2. Process car entries in a stream to simulate concurrent processing.
 */

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.IntStream;

class TrafficLightStream {
    private final AtomicBoolean isNorthSouthGreen = new AtomicBoolean(true);
    private final BlockingQueue<Car> queue = new LinkedBlockingQueue<>();

    // Car class
    static class Car {
        private final int carId;
        private final int direction;

        public Car(int carId, int direction) {
            this.carId = carId;
            this.direction = direction;
        }

        public int getDirection() {
            return direction;
        }
    }

    public void processCars() {
        queue.forEach(car -> {
            synchronized (this) {
                while ((isNorthSouthGreen.get() && (car.getDirection() == 2 || car.getDirection() == 3)) ||
                       (!isNorthSouthGreen.get() && (car.getDirection() == 0 || car.getDirection() == 1))) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
                System.out.println("Car " + car.carId + " from direction " + car.getDirection() + " is passing.");
                isNorthSouthGreen.set(!isNorthSouthGreen.get());
                notifyAll();
            }
        });
    }

    public void addCar(Car car) {
        queue.add(car);
    }
}

public class MainStream {
    public static void main(String[] args) {
        TrafficLightStream trafficLight = new TrafficLightStream();
        IntStream.range(1, 3).forEach(i -> trafficLight.addCar(new TrafficLightStream.Car(i, i % 4)));
        trafficLight.processCars();
    }
}

解释

方法:

该题解模拟了一个红绿灯交通灯控制系统,其中每次车辆到达交叉路口时,会调用carArrived方法。系统维护一个状态self.road,用来记录当前绿灯的路(1代表路A,2代表路B)。当一辆车到达时,首先判断该车所在的路是否已有绿灯。如果已有绿灯(即self.road等于车辆的roadId),车辆将直接通过crossCar()方法过路口。如果该路不是绿灯路,系统先通过turnGreen()方法将交通灯切换到该车所在的路,然后更新self.road状态,并允许车辆通过crossCar()方法过路口。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
题解中提到当车辆到达时会判断当前绿灯路是否与车辆所在路相同。请问如果两辆车同时到达但属于不同的路,该系统如何处理这种情况?
题解中的系统实现并未明确处理两辆车同时到达且来自不同路的情况。在实际应用中,这种情况需要通过引入并发控制机制,如互斥锁(mutex)或信号量(semaphores),来确保当一个交通灯正在处理一辆车时,其他车辆的请求得到适当的排队和处理。此外,可以添加逻辑来检测并解决冲突,例如优先处理队列中等待时间最长的车辆。
🦆
在交通灯控制系统中,是否有其他的状态或者错误处理机制来应对例如信号异常或交通灯故障的情况?
题解中的系统实现没有提及特定的错误处理或异常处理机制。在完整的系统设计中,应该包括故障检测机制,如监测交通灯的工作状态和通信系统的完整性。一旦检测到故障或异常,应该触发备用系统或通知维修队伍进行修复。此外,可以实现一个警告系统,向司机发送故障信息,确保交通安全。
🦆
题解中的方法每次车辆到达都会直接调用turnGreen和crossCar方法,这是否意味着系统设计中没有考虑节能和优化交通流的可能性,例如通过延迟切换绿灯或者优先级控制?
题解中的实现确实没有显示考虑节能和优化交通流的措施。在更高级的交通灯控制系统中,通常会集成交通流量监控和智能调度算法,例如基于实时交通数据动态调整绿灯时长,或实现车辆优先级控制,如公交车和救护车优先通行。此外,还可以考虑非高峰时段减少绿灯切换频率,以节省能源并减少等待时间。
🦆
在实际应用中,交通流动性也受到车辆类型和大小的影响。题解是否能够适应不同类型车辆的需求,例如大型车辆或紧急车辆?
题解中的交通灯控制系统并没有特别说明对不同类型车辆的适应性。在实际应用中,系统需要能够识别并优先处理特定类型的车辆,如紧急车辆(救护车、消防车等)。这通常通过车载发射器和交通灯接收器实现,使得紧急车辆能够在接近交叉口时自动触发绿灯。此外,对于大型车辆,可能需要调整绿灯持续时间,以确保这些车辆能安全通过交叉口。

相关问题