打印零与奇偶数 思路分析
1116. 打印零与奇偶数
class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero(printNumber) { ... } // 仅打印出 0public void even(printNumber) { ... } // 仅打印出 偶数public void odd(printNumber) { ... } // 仅打印出 奇数
}
相同的一个 ZeroEvenOdd
类实例将会传递给三个不同的线程:
每个线程都有一个 printNumber
方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506
… ,其中序列的长度必须为 2n。
输入:n = 2
输出:"0102"
说明:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 "0102"。
输入: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只能输入奇数,
打印零与奇偶数 思路分析相关推荐
- 打印零与奇偶数(多线程)
假设有这么一个类: class ZeroEvenOdd {public ZeroEvenOdd(int n) { ... } // 构造函数public void zero(printNumber) ...
- 顺时针打印矩阵 C++实现与思路分析
顺时针打印矩阵 C++实现与思路分析 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- Java打印菱形的思路分析
在控制台打印菱形是个很经典的题目,考察的是对嵌套循环的使用. 题目的要求是,打印出如下菱形: 思路分析: 因为代码都是自上而下,从左往右一步步运行的,所以想要打印出这样的图形需要先拆解它,分析它的构成 ...
- C语言- 循环打印 for循环例子(判断奇偶数) 第四讲
回顾: * 程序目的 猜数游戏(单数) * scanf() //与程序交互的用法 * 流 ...
- pd.merge 结果出现重复_COUNTIFS函数技巧之去重复值计数(思路分析,过程详解)...
各位读者朋友们大家好,今天给大家介绍COUNTIFS函数的技巧性用法一,去除重复值计数.何为去除重复值计数呢?简单来说,当我们的数据源中存在重复值时,而我们只想将重复值计算一次,来计算不重复的项目有多 ...
- 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] 返 ...
- 2022华数杯B题论文思路分析+完整代码(水下机器人组装计划)(一二问答案接出来和标准答案一样)(问题三四逼近正确答案)(完整论文,代码可直接跑)
写在前面:学校最近搞数学建模竞赛培训,以2022华数杯B题作为训练题目,在查资料过程中发现网上没有哪一篇论文解出了正确答案,而我们组利用Lingo软件准确的解出了正确答案,但是在第三问时,由于决策的变 ...
- WPS表格奇偶数页打印怎么设置?如何只打印奇数页?
平时我们在打印 WPS 文字的时候,可以很轻松地选择打印奇偶页或只打印奇数页或偶数页,详见『WPS 如何设置打印奇数页和偶数页?』.但是如果我们需要打印 WPS 表格里面的内容就无法找到"打 ...
- PTA 电话聊天狂人 思路分析及代码解析
PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...
最新文章
- linux 定位 踩内存_运维必备的问题定位工具及案例分析
- Y Combinator
- CodeForces - 1330D Dreamoon Likes Sequences(组合数学)
- github上面如何编辑README
- 跨站点脚本(xss)_跨站点脚本(XSS)和预防
- mac 安装mysql怎么卸载不干净_CleanMyMac卸载不干净怎么办?如何彻底删除Mac上的CleanMyMac?...
- centos7搭建单机kafka集群
- python邮箱配置_python flask mail QQ邮箱配置
- VMware SDS 什么是VSAN?? VSAN的体系结构 (含VSAN 6.0、6.1版的新内容)
- You may use special comments to disable some warnings. Use // eslint-disable-next-line……
- aliplayer隐藏工具条
- VMware虚拟机安装黑苹果
- 深度linux双系统切换快捷键,苹果 Mac双系统如何切换?用Option键切换双系统的步骤分享...
- 【计算机视觉】图像拼接技术
- C语言学习笔记之初识
- 计算机网络:IP地址
- html中td内容不换行显示,html小技巧之td,div标签里内容不换行
- 互联网商业变现与计算广告(干货+5000字精彩问答)
- 如何理解「外汇储备导致人民币货币增加」?
- 安装VS2010的过程遇到VC10.0 Runtime组件安装失败怎么解决
热门文章
- NoSQL 简单介绍
- 网络与验证服务器失联怎样修复,GCP用一键服务器失联了,如何重装系统?
- git clone出现 fatal: unable to access 'https://github.com/...'的解决办法(亲测有效)
- K邻近算法(K-NN)
- stm32在linux下开发(一)
- 七夕祝福网页制作_程序员怎么过七夕?
- 微信开发 ━━ 微信商户v3微信支付H5方式开发之php篇
- Android Studio的报错提示:SSL peer shut down incorrectly
- 图、拉普拉斯矩阵与傅里叶变换
- 一套简单的web即时通讯——第三版