1195. 交替打印字符串

news/2025/10/28 12:00:22/文章来源:https://www.cnblogs.com/clarencezzh/p/19171450

1195. 交替打印字符串

题目描述

编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:

  • 如果这个数字可以被 3 整除,输出 "fizz"。
  • 如果这个数字可以被 5 整除,输出 "buzz"。
  • 如果这个数字可以同时被 3 和 5 整除,输出 "fizzbuzz"。

例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz

假设有这么一个类:

class FizzBuzz {
  public FizzBuzz(int n) { ... }               // constructorpublic void fizz(printFizz) { ... }          // only output "fizz"public void buzz(printBuzz) { ... }          // only output "buzz"public void fizzbuzz(printFizzBuzz) { ... }  // only output "fizzbuzz"public void number(printNumber) { ... }      // only output the numbers
}

请你实现一个有四个线程的多线程版  FizzBuzz, 同一个 FizzBuzz 实例会被如下四个线程使用:

  1. 线程A将调用 fizz() 来判断是否能被 3 整除,如果可以,则输出 fizz
  2. 线程B将调用 buzz() 来判断是否能被 5 整除,如果可以,则输出 buzz
  3. 线程C将调用 fizzbuzz() 来判断是否同时能被 3 和 5 整除,如果可以,则输出 fizzbuzz
  4. 线程D将调用 number() 来实现输出既不能被 3 整除也不能被 5 整除的数字。

 

提示:

  • 本题已经提供了打印字符串的相关方法,如 printFizz() 等,具体方法名请参考答题模板中的注释部分。

 

解法

Java

class FizzBuzz {private int n;private int current = 1;public FizzBuzz(int n) {this.n = n;}// printFizz.run() outputs "fizz".public void fizz(Runnable printFizz) throws InterruptedException {while (current <= n) {synchronized (this) {if (current % 3 == 0 && current % 5 != 0) {if (current <= n) {printFizz.run();current++;notifyAll();}} else {wait();}}}}// printBuzz.run() outputs "buzz".public void buzz(Runnable printBuzz) throws InterruptedException {while (current <= n) {synchronized (this) {if (current % 5 == 0 && current % 3 != 0) {if (current <= n) {printBuzz.run();current++;notifyAll();}} else {wait();}}}}// printFizzBuzz.run() outputs "fizzbuzz".public void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {while (current <= n) {synchronized (this) {if (current % 15 == 0) {if (current <= n) {printFizzBuzz.run();current++;notifyAll();}} else {wait();}}}}// printNumber.accept(x) outputs "x", where x is an integer.public void number(java.util.function.IntConsumer printNumber) throws InterruptedException {while (current <= n) {synchronized (this) {if (current % 3 != 0 && current % 5 != 0) {if (current <= n) {printNumber.accept(current);current++;notifyAll();}} else {wait();}}}}
}

Java

关于"唤醒所有线程以便退出"这个操作,分析如下:

是否必须取决于具体实现

  • 不是绝对必须的:当 current > n 时,理论上各线程应该已经在各自的 while(current <= n) 循环中自然退出

  • 建议保留的原因

    1. 确保及时退出:避免某些线程长时间处于 await() 状态
    2. 防止内存泄漏:确保所有线程都能正常结束,释放资源
    3. 提高健壮性:即使主流程出现异常,也能保证线程正常终止

替代方案

如果不使用 signalAll(),也可以采用以下方式:

private void signalNext() {if (current > n) {return; // 直接返回,让各线程自然退出} else if (current % 15 == 0) {fizzbuzzCondition.signal();} else if (current % 3 == 0) {fizzCondition.signal();} else if (current % 5 == 0) {buzzCondition.signal();} else {numberCondition.signal();}
}

结论

虽然不是严格必需,但添加 signalAll() 是一种良好的编程实践,能确保程序更可靠地退出。

class FizzBuzz {private int n;private int current = 1;private final Lock lock = new ReentrantLock();private final Condition fizzCondition = lock.newCondition();private final Condition buzzCondition = lock.newCondition();private final Condition fizzbuzzCondition = lock.newCondition();private final Condition numberCondition = lock.newCondition();public FizzBuzz(int n) {this.n = n;}public void fizz(Runnable printFizz) throws InterruptedException {lock.lock();try {while (current <= n) {if (current % 3 == 0 && current % 5 != 0) {printFizz.run();current++;signalNext();} else {fizzCondition.await();}}} finally {lock.unlock();}}public void buzz(Runnable printBuzz) throws InterruptedException {lock.lock();try {while (current <= n) {if (current % 5 == 0 && current % 3 != 0) {printBuzz.run();current++;signalNext();} else {buzzCondition.await();}}} finally {lock.unlock();}}public void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {lock.lock();try {while (current <= n) {if (current % 15 == 0) {printFizzBuzz.run();current++;signalNext();} else {fizzbuzzCondition.await();}}} finally {lock.unlock();}}public void number(IntConsumer printNumber) throws InterruptedException {lock.lock();try {while (current <= n) {if (current % 3 != 0 && current % 5 != 0) {printNumber.accept(current);current++;signalNext();} else {numberCondition.await();}}} finally {lock.unlock();}}private void signalNext() {if (current > n) {// 唤醒所有线程以便退出fizzCondition.signalAll();buzzCondition.signalAll();fizzbuzzCondition.signalAll();numberCondition.signalAll();} else if (current % 15 == 0) {fizzbuzzCondition.signal();} else if (current % 3 == 0) {fizzCondition.signal();} else if (current % 5 == 0) {buzzCondition.signal();} else {numberCondition.signal();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信ipad协议实现聚合聊天系统、RPA机器人智能回复

企业微信ipad协议实现聚合聊天系统、RPA机器人智能回复一、企业微信iPad协议技术解析 企业微信iPad协议是一种基于企业微信iPad版本的智能接口服务,通过自主研发的中间件技术实现企业微信生态功能的深度集成 。 与依赖…

2025年市面上别墅石材品牌与行业内别墅石材源头厂家推荐榜单及口碑好的别墅石材产品分析

摘要 随着高端住宅市场持续升温,别墅石材行业在2025年迎来新一轮发展机遇。消费者对石材品质、设计美感及供应链可靠性要求显著提升,本文基于市场调研数据及行业洞察,梳理当前别墅石材领域具有竞争力的品牌与企业。…

最近公共祖先 (LCA)

\(update : 2025/10/28\) 最近公共祖先, 即 \(LCA\) (\(Least\; Common\; Ancestor\)), 顾名思义, 用于在一棵树中求两个点的最近公共祖先 方法有很多, 效率和码量各有千秋 倍增法 很经典的 \(lca\) 求法, 主要是好理解…

IP归属地颗粒度和IP应用场景的关系

在我们日常生活中,IP地址归属地定位(即识别IP对应地理位置)的精度(颗粒度)常因使用方式不同而各异。颗粒度指的是位置识别的细致程度,例如国家、省、城市、区县或街道层级。IP地址的应用场景(如家庭宽带或数据中…

ChatGPT API集成测试自动化框架的实践与成效汇报

一、项目背景与目标 随着软件测试复杂度的提升,传统测试流程面临效率瓶颈。2025年,我司测试团队探索将ChatGPT API集成至现有自动化框架,旨在通过自然语言处理能力优化测试用例生成、缺陷定位及报告分析等环节,实现…

[题解]【MX-S8】梦熊 CSP-S 2025 模拟赛

原比赛页面 ~ 官方题解(直播回放) T1. P14308 【MX-S8-T1】斐波那契螺旋 发现方形的边长是斐波那契数列,增长非常快。打表发现,只要 \(91\) 个方形就能覆盖 \([-10^{18},10^{18}]\) 内的所有点。 所以模拟即可。时…

2025四川碳晶板品牌

文章摘要 碳晶板作为现代建筑装饰材料的新兴趋势,近年来在环保、耐用性和安装便捷性方面展现出显著优势,行业年增长率预计达15%以上。本文基于市场调研和用户反馈,整理了2025年碳晶板品牌排名前十的榜单,旨在为读者…

详细介绍:求余运算和数学模运算的知识了解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于蚁群算法解决车辆路径问题(VRP)的MATLAB实现

一、算法框架设计 %% 参数设置 m = 31; % 蚂蚁数量(建议取城市数平方根) alpha = 1; % 信息素重要度 beta = 5; % 启发式信息重要度 rho = 0.1; % 信息素挥发系数 Q = 100; % 信息素…

2025 年工业除湿机,恒温恒湿机,精密空调,除湿加湿一体机厂家最新推荐,产能、专利、环保三维数据透视

引言 工业生产与商用场景中,温湿度精准控制直接影响设备寿命与产品品质,潮湿或温湿度失衡可能导致电子元件失效、医药原料变质等问题。随着市场需求升级,相关设备厂家数量激增,但产品性能差异显著,部分设备存在除…

从手动到全自动:我们如何用Dify重构了API回归测试流程

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 在敏捷开发成为主流的今天,API回归测试已成为保障软件质量的关键环节。然而,传统手动回归测试模式在快速迭代中显得力不从心。本文将完整…

2025 年管道除湿机,中央除湿机,新风除湿机,变频除湿机厂家最新推荐,产能、专利、环保三维数据透视

引言 管道、中央、新风及变频除湿机作为精准控湿的核心设备,已广泛应用于工业生产、商业办公及家庭生活等多元场景。但市场调研显示,同类产品除湿量实测值最大相差 41.7%,单位能耗效率差异近一倍,给采购者带来极大…

2025年10月中国管理咨询公司推荐榜:五强数据对比

正在升级产线、准备上市、或是被库存和交付周期反复折磨的制造业老板,最近常把同一句话挂在口头:“有没有真能把方案落到车间、落到报表上的咨询公司?”政策层面,工信部《“十四五”智能制造规划》把“管理提升”写…

条码识别插件 quaggaJS - microsoft

github下载地址 document.querySelector("#barCode").addEventListener(change, function (evt) {const file = evt.target.files[0];const fileURL = URL.createObjectURL(file);// 使用 Quagga 解码条形码…

2025年10月中国管理咨询公司推荐榜:金蓝盟领衔六强对比评测

正在升级产线、谋划上市的制造业老板,常被“选谁做陪跑”困扰:预算有限,又怕方案落不了地;同行推荐五花八门,分不清谁在套模板、谁真懂工厂。工信部数据显示,60%以上制造企业管理系统不完善,产能利用率不足75%,…

基于3GPP LTE标准的信道仿真模型

一、LTE标准信道模型类型 根据3GPP TS 36.104规范,LTE主要采用以下信道模型:静态信道模型AWGN:高斯白噪声信道 EPA(Extended Pedestrian A):行人环境多径衰落 EVA(Extended Vehicular A):车载环境多径衰落 ET…

2025 年灵巧手厂家最新推荐榜,技术实力与市场口碑深度解析,筛选高适配性与长耐用性优质品牌

引言 随着人形机器人产业进入高速发展期,灵巧手作为核心执行部件,其性能与品质直接影响机器人应用落地效果。为给行业采购提供权威参考,机器人产业协会联合机器人检测与评定中心,开展了 2025 年度灵巧手品牌测评工…

Dify工作流实战:一键自动生成测试报告并推送钉钉,我每天白赚1小时

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 曾经,每天下班前的手动测试报告整理是我最头疼的工作。需要从多个测试平台收集数据、整理成统一格式、分析关键指标,最后再手动发送给团队…

CF2043D Problem about GCD

刻进骨子里的结论。 首先显然是先除以 \(G\),然后变成区间内最远互质点对,由质数分布定理得,这个点对和区间长度是一个量级的,我们枚举长度后再枚举端点,复杂度是可以接受的。

2025年10月智能工厂规划咨询公司排行:五家对比一目了然

“到底该找谁才能把老厂改造成真正的智能工厂?”——这是过去三个月里,我接到的高频提问。提问者大多是年产值5-50亿元的制造型企业负责人:订单碎片化、交期被客户压缩到按小时计算,现有产能利用率却不足75%,工信…