1279 红绿灯路口

每条路在路口前都有一个红绿灯。红绿灯可以亮起红灯或绿灯。绿灯表示两个方向的车辆都可通过路口。
红灯表示两个方向的车辆都不可以通过路口,必须等待绿灯亮起。
两条路上的红绿灯不可以同时为绿灯。这意味着,当 A 路上的绿灯亮起时,B 路上的红灯会亮起;当 B 路上的绿灯亮起时,A 路上的红灯会亮起.开始时,A 路上的绿灯亮起,B 路上的红灯亮起。当一条路上的绿灯亮起时,所有车辆都可以从任意两个方向通过路口,直到另一条路上的绿灯亮起。不同路上的车辆不可以同时通过路口。给这个路口设计一个没有死锁的红绿灯控制系统。实现函数 void carArrived(carId, roadId, direction, turnGreen, crossCar) :carId 为到达车辆的编号。
roadId 为车辆所在道路的编号。
direction 为车辆的行进方向。
turnGreen 是一个函数,调用此函数会使当前道路上的绿灯亮起。
crossCar 是一个函数,调用此函数会允许车辆通过路口。
当你的答案避免了车辆在路口出现死锁,此答案会被认定为正确的。当路口已经亮起绿灯时仍打开绿灯,此答案会被认定为错误的。示例 1:
输入: cars = [1,3,5,2,4], directions = [2,1,2,4,3], arrivalTimes = [10,20,30,40,50]
输出: [
“Car 1 Has Passed Road A In Direction 2”, // A 路上的红绿灯为绿色,1 号车可通过路口。
“Car 3 Has Passed Road A In Direction 1”, // 红绿灯仍为绿色,3 号车通过路口。
“Car 5 Has Passed Road A In Direction 2”, // 红绿灯仍为绿色,5 号车通过路口。
“Traffic Light On Road B Is Green”, // 2 号车在 B 路请求绿灯。
“Car 2 Has Passed Road B In Direction 4”, // B 路上的绿灯现已亮起,2 号车通过路口。
“Car 4 Has Passed Road B In Direction 3” // 红绿灯仍为绿色,4 号车通过路口。
]示例 2:
输入: cars = [1,2,3,4,5], directions = [2,4,3,3,1], arrivalTimes = [10,20,30,40,40]
输出: [
“Car 1 Has Passed Road A In Direction 2”, // A 路上的红绿灯为绿色,1 号车可通过路口。
“Traffic Light On Road B Is Green”, // 2 号车在 B 路请求绿灯。
“Car 2 Has Passed Road B In Direction 4”, // B 路上的绿灯现已亮起,2 号车通过路口。
“Car 3 Has Passed Road B In Direction 3”, // B 路上的绿灯现已亮起,3 号车通过路口。
“Traffic Light On Road A Is Green”, // 5 号车在 A 路请求绿灯。
“Car 5 Has Passed Road A In Direction 1”, // A 路上的绿灯现已亮起,5 号车通过路口。
“Traffic Light On Road B Is Green”, // 4 号车在 B 路请求绿灯。4 号车在路口等灯,直到 5 号车通过路口,B 路的绿灯亮起。
“Car 4 Has Passed Road B In Direction 3” // B 路上的绿灯现已亮起,4 号车通过路口。
]
解释: 这是一个无死锁的方案。注意,在 A 路上的绿灯亮起、5 号车通过前让 4 号车通过,也是一个正确且可被接受的方案。提示:
1 <= cars.length <= 20
cars.length = directions.length
cars.length = arrivalTimes.length
cars 中的所有值都是唯一的。
1 <= directions[i] <= 4
arrivalTimes 是非递减的。

方法1:Semaphore

class TrafficLight {private Semaphore semaphore = new Semaphore(1);boolean isAGreen = true;public void carArrived(int carId,           // ID of the carint roadId,          // ID of the road the car travels on. Can be 1 (road A) or 2 (road B)int direction,       // Direction of the carRunnable turnGreen,  // Use turnGreen.run() to turn light to green on current roadRunnable crossCar    // Use crossCar.run() to make car cross the intersection) throws InterruptedException {semaphore.acquire();if (roadId == 2 && isAGreen || roadId == 1 && !isAGreen) {turnGreen.run();isAGreen = !isAGreen;}crossCar.run();semaphore.release();}
}

方法2:变量

class TrafficLight {boolean isAGreen;public TrafficLight() {isAGreen = true;}synchronized public void carArrived(int carId,           // ID of the carint roadId,          // ID of the road the car travels on. Can be 1 (road A) or 2 (road B)int direction,       // Direction of the carRunnable turnGreen,  // Use turnGreen.run() to turn light to green on current roadRunnable crossCar    // Use crossCar.run() to make car cross the intersection) {if (roadId == 2 && isAGreen == true || roadId == 1 && isAGreen == false) {turnGreen.run();isAGreen = !isAGreen;}crossCar.run();}
}

畅游多线程之红绿灯路口相关推荐

  1. LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

    目录 1114. 按序打印 解法 1115. 交替打印FooBar 解法 1116. 打印零与奇偶数 解法 1117. H2O 生成 解法 1118. 设计有限阻塞队列 解法 1195. 交替打印字符 ...

  2. 坡道行驶电动小车_事发红绿灯路口!东莞一女子骑电动滑板车被撞致颅内出血…...

    东莞的小伙伴们应该都在路上见过电动滑板车一些上班族平时都用它代步但大家在享受电动滑板车的便捷时一定要提高安全意识否则就容易发生意外!事件回顾近日在东莞厚街S256省道濠畔红绿灯路口发生一起电动滑板车与 ...

  3. 科目三 临时停车 与 红绿灯 路口 LTS

    科目三 临时停车 与 红绿灯 路口 LTS 临时停车 ,需要双闪不 昨天考挂了,绿灯还有12妙没有过,安全员判定不合格 教练说十秒内可以停/ 2挡不超30码就不会出现档位车速不配色.红绿灯也没规定挂空 ...

  4. LeetCode(多线程)- 1279. 红绿灯路口

    题目链接:点击打开链接 题目大意:略. 解题思路:略. 相关企业 亚马逊(Amazon) 高盛集团(Goldman Sachs) 苹果(Apple) 微软(Microsoft) 谷歌(Google) ...

  5. Leetcode_1279_红绿灯路口_多线程

    用一个布尔型变量保存目前红绿灯状态. 如果目前的车能通过红绿灯,就让他通过. 如果不能,改变灯的状态. class TrafficLight {boolean isAGreen; public Tra ...

  6. LeetCode-1279. 红绿灯路口

    这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶.第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西行驶. 每条 ...

  7. 1279 红绿灯路口

    题目描述: 这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶.第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西 ...

  8. 【LeetCode-多线程】1279. 红绿灯路口

    目录 一.题目 二.解决 1.synchronized 2.CAS 3.Lock 4.信号量 三.参考 一.题目 这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 ...

  9. LeetCode题解(1279):红绿灯路口(Python)

    题目:原题链接(简单) 标签:多线程 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N)O(N)O(N) O(1)O(1)O(1) 52ms (88.89%) Ans 2 ...

最新文章

  1. 机器学习萌新必备的三种优化算法 | 选型指南
  2. 盛大 牛人 blog
  3. XMLHttpRequest
  4. HACMP 认证学习系列,第 2 部分:计划与设计
  5. Python脚本解密RSA加密密码
  6. iOS 设置系统音量和监听系统音量变化
  7. BigDecimal 运用示例 与 DecimalFormat
  8. 面试题系列(9):对前端界面工程师这个职位是怎么样理解的?
  9. OJ(Online Judge)系统汇总
  10. python爬虫要安装什么_python爬虫之分布式爬虫和部署
  11. vue的h函数_Vue中render中的h箭头函数
  12. hpsocket java代码_java版本调用HP-Socket服务端代码
  13. 雷电模拟器 服务器无响应,雷电模拟器怎么用脚本长时间运行未响应win10
  14. Qt+OpenVino部署yolo5模型
  15. 谷歌浏览器在新页面打开_如何在Google文档中更改页面方向
  16. 【图的存储】邻接多重表
  17. 头像叠加android_使用RecyclerView实现点赞头像叠加效果
  18. 梅科尔工作室—罗森——鸿蒙笔记2
  19. android aar编程,Android Studio模块化编程实践之aar
  20. 一时学习一时爽,持续学习持续爽

热门文章

  1. 2018华人AI学术影响力Top100
  2. 中兴U830移动定制手机获取root权限详细操作
  3. 2023最新python毕业设计 开题 选题推荐
  4. 2021-09-11-生信技能树-作业1
  5. Dell一体机升级SSD
  6. 《那些年啊,那些事——一个程序员的奋斗史》——71
  7. Terrain Stitcher的学习
  8. 高校计算机考试准考证号
  9. CRM是什么意思?它能够做什么?
  10. 国庆 day 3 上午