1116. 打印零与奇偶数

假设有这么一个类:

class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... }      // 构造函数public void zero(printNumber) { ... }  // 仅打印出 0public void even(printNumber) { ... }  // 仅打印出 偶数public void odd(printNumber) { ... }   // 仅打印出 奇数
}

相同的一个 ZeroEvenOdd 类实例将会传递给三个不同的线程:

  1. 线程 A 将调用 zero(),它只输出 0 。
  2. 线程 B 将调用 even(),它只输出偶数。
  3. 线程 C 将调用 odd(),它只输出奇数。

每个线程都有一个 printNumber 方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506… ,其中序列的长度必须为 2n

示例 1:

输入:n = 2
输出:"0102"
说明:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 "0102"。

示例 2:

输入:n = 5
输出:"0102030405"
思路分析:

1.输入的n, zero需要执行n次,even+odd的执行次数等于n次;

2.代码实现时,确保先执行zero,执行zero时,根据当前的执行次数是奇偶数选择执行even或odd,

3.执行even或odd,可通过明确信号量或特定的条件控制

代码实现:
1.特定的条件控制
class ZeroEvenOdd {private int n;private int i=0;private int flag = 0;private Object lock = new Object();public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {for(int j=1;j<=n;j++){synchronized(lock){while(flag!=0){lock.wait();}printNumber.accept(0);flag=1;i=j;lock.notifyAll();}}}public void even(IntConsumer printNumber) throws InterruptedException {for(int j=2;j<=n;j=j+2){synchronized(lock){while(flag!=1||i!=j){lock.wait();}printNumber.accept(j);flag=0;lock.notifyAll();}}}public void odd(IntConsumer printNumber) throws InterruptedException {for(int j=1;j<=n;j=j+2){synchronized(lock){while(flag!=1||i!=j){lock.wait();}printNumber.accept(j);flag=0;lock.notifyAll();}}}
}
2.信号量控制
class ZeroEvenOdd {private int n;private Semaphore zS = new Semaphore(1);private Semaphore eS = new Semaphore(0);private Semaphore oS = new Semaphore(0);public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {for(int j=1;j<=n;j++){zS.acquire();printNumber.accept(0);if (j % 2 == 0) {eS.release();} else {oS.release();}}}public void even(IntConsumer printNumber) throws InterruptedException {for(int j=2;j<=n;j=j+2){eS.acquire();printNumber.accept(j);zS.release();}}public void odd(IntConsumer printNumber) throws InterruptedException {for(int j=1;j<=n;j=j+2){oS.acquire();printNumber.accept(j);zS.release();}}
}
运行报错You passed invalid value. Exiting:

LeetCode底层实现时,

zero中printNumber.accept只能输入0,

even中printNumber.accept只能输入偶数,

odd中printNumber.accept只能输入奇数,

打印零与奇偶数 思路分析相关推荐

  1. 打印零与奇偶数(多线程)

    假设有这么一个类: class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero(printNumber) ...

  2. 顺时针打印矩阵 C++实现与思路分析

    顺时针打印矩阵 C++实现与思路分析 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  3. Java打印菱形的思路分析

    在控制台打印菱形是个很经典的题目,考察的是对嵌套循环的使用. 题目的要求是,打印出如下菱形: 思路分析: 因为代码都是自上而下,从左往右一步步运行的,所以想要打印出这样的图形需要先拆解它,分析它的构成 ...

  4. C语言- 循环打印 for循环例子(判断奇偶数) 第四讲

    回顾: *                  程序目的   猜数游戏(单数) *                  scanf()    //与程序交互的用法 *                  流 ...

  5. pd.merge 结果出现重复_COUNTIFS函数技巧之去重复值计数(思路分析,过程详解)...

    各位读者朋友们大家好,今天给大家介绍COUNTIFS函数的技巧性用法一,去除重复值计数.何为去除重复值计数呢?简单来说,当我们的数据源中存在重复值时,而我们只想将重复值计算一次,来计算不重复的项目有多 ...

  6. python四位玫瑰数的解题思路_入门python知识点总结以及15道题的解题思路分析

    知识点总结python 1.序列app 操做符ide x in s 若是x是列表s的元素,返回True,不然False s + t 链接两个序列s和t s*n或者n*s 将序列s复制n次 s[i] 返 ...

  7. 2022华数杯B题论文思路分析+完整代码(水下机器人组装计划)(一二问答案接出来和标准答案一样)(问题三四逼近正确答案)(完整论文,代码可直接跑)

    写在前面:学校最近搞数学建模竞赛培训,以2022华数杯B题作为训练题目,在查资料过程中发现网上没有哪一篇论文解出了正确答案,而我们组利用Lingo软件准确的解出了正确答案,但是在第三问时,由于决策的变 ...

  8. WPS表格奇偶数页打印怎么设置?如何只打印奇数页?

    平时我们在打印 WPS 文字的时候,可以很轻松地选择打印奇偶页或只打印奇数页或偶数页,详见『WPS 如何设置打印奇数页和偶数页?』.但是如果我们需要打印 WPS 表格里面的内容就无法找到"打 ...

  9. PTA 电话聊天狂人 思路分析及代码解析

    PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...

最新文章

  1. linux 定位 踩内存_运维必备的问题定位工具及案例分析
  2. Y Combinator
  3. CodeForces - 1330D Dreamoon Likes Sequences(组合数学)
  4. github上面如何编辑README
  5. 跨站点脚本(xss)_跨站点脚本(XSS)和预防
  6. mac 安装mysql怎么卸载不干净_CleanMyMac卸载不干净怎么办?如何彻底删除Mac上的CleanMyMac?...
  7. centos7搭建单机kafka集群
  8. python邮箱配置_python flask mail QQ邮箱配置
  9. VMware SDS 什么是VSAN?? VSAN的体系结构 (含VSAN 6.0、6.1版的新内容)
  10. You may use special comments to disable some warnings. Use // eslint-disable-next-line……
  11. aliplayer隐藏工具条
  12. VMware虚拟机安装黑苹果
  13. 深度linux双系统切换快捷键,苹果 Mac双系统如何切换?用Option键切换双系统的步骤分享...
  14. 【计算机视觉】图像拼接技术
  15. C语言学习笔记之初识
  16. 计算机网络:IP地址
  17. html中td内容不换行显示,html小技巧之td,div标签里内容不换行
  18. 互联网商业变现与计算广告(干货+5000字精彩问答)
  19. 如何理解「外汇储备导致人民币货币增加」?
  20. 安装VS2010的过程遇到VC10.0 Runtime组件安装失败怎么解决

热门文章

  1. NoSQL 简单介绍
  2. 网络与验证服务器失联怎样修复,GCP用一键服务器失联了,如何重装系统?
  3. git clone出现 fatal: unable to access 'https://github.com/...'的解决办法(亲测有效)
  4. K邻近算法(K-NN)
  5. stm32在linux下开发(一)
  6. 七夕祝福网页制作_程序员怎么过七夕?
  7. 微信开发 ━━ 微信商户v3微信支付H5方式开发之php篇
  8. Android Studio的报错提示:SSL peer shut down incorrectly
  9. 图、拉普拉斯矩阵与傅里叶变换
  10. 一套简单的web即时通讯——第三版