数据结构与算法之异步: LeetCode 1114. 按序打印 (Ts版)

AI Agent、MCP协议与Skill的真实关系:从混沌到可调试的工程实践 AI Agent 是面向目标的智能体架构,MCP(Model Context Protocol)是其与外部工具交互的运行时契约,而 Skill 则是基于 MCP 的能力编排单元。三者分属不同抽象层级:Agent 定义调度逻辑,MCP 规范通信语义与上下文流转,Skill 实现意图驱动的工具调用链。这种分层结构决定了真实开发必须聚焦进程间协作、Schema 验证时机、Context 映射规则等可调试细节。典型应用场景包括微信客服自动化、多模型风控决策、Figma 设计稿分析等,其技术价值在于解耦基础设施与业务 阅读详情

按序打印

描述

  • 给你一个类:

    public class Foo {
      public void first() { print("first"); }
      public void second() { print("second"); }
      public void third() { print("third"); }
    }
    
  • 三个不同的线程 A、B、C 将会共用一个 Foo 实例。

    • 线程 A 将会调用 first() 方法
    • 线程 B 将会调用 second() 方法
    • 线程 C 将会调用 third() 方法
  • 请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行

提示

  • 尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在操作系统中的调度顺序
  • 你看到的输入格式主要是为了确保测试的全面性

示例 1

输入:nums = [1,2,3]
输出:"firstsecondthird"

解释:
有三个线程会被异步启动。输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。正确的输出是 “firstsecondthird”。

示例 2

输入:nums = [1,3,2]
输出:"firstsecondthird"

解释:
输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。正确的输出是 “firstsecondthird”

提示

  • nums 是 [1, 2, 3] 的一组排列

Typescript 版算法实现


1 ) 方案1:使用 synchronization

class Foo {
  private firstJobDone: boolean = false;
  private secondJobDone: boolean = false;

  constructor() {}

  // 第一个任务,不需要等待任何其他任务完成
  public async first(printFirst: () => void) {
      // 执行第一个任务
      printFirst();
      // 标记第一个任务已完成
      this.firstJobDone = true;
  }

  // 第二个任务,需要等待第一个任务完成
  public async second(printSecond: () => void) {
      // 等待第一个任务完成
      while (!this.firstJobDone) {
          await new Promise(resolve => setTimeout(resolve, 1)); // 简单的轮询等待
      }
      // 执行第二个任务
      printSecond();
      // 标记第二个任务已完成
      this.secondJobDone = true;
  }

  // 第三个任务,需要等待第二个任务完成
  public async third(printThird: () => void) {
      // 等待第二个任务完成
      while (!this.secondJobDone) {
          await new Promise(resolve => setTimeout(resolve, 1)); // 简单的轮询等待
      }
      // 执行第三个任务
      printThird();
  }
}

// 测试用例
const testFoo = async () => {
  const foo = new Foo();

  const printFirst = () => console.log('first');
  const printSecond = () => console.log('second');
  const printThird = () => console.log('third');

  // 并发调用方法,但它们会按顺序执行
  const tasks = [
      foo.first(printFirst),
      foo.second(printSecond),
      foo.third(printThird)
  ];

  // 使用 Promise.all 确保所有任务都完成
  await Promise.all(tasks);
};

testFoo().catch(console.error);
LeetCode 1114. 按序打印 我们提供了一个类: public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); } } 三个不同的线程 A、B、C 将会共用一个 Foo 实例。 一个将会调用 first() 方法 一个将会调用 second() 方法 还有一个将会调用 third() 方法 请设计修改程序,以确 阅读详情

相关推荐

Codex CLI模型选型与配置避坑指南

Codex CLI是面向开发者的关键AI编码工具链,其核心能力依赖于后端模型(如GPT-5.3-Codex、GPT-5.4-turbo)与命令行参数的精准对齐。理解模型命名规范、上下文窗口物理限制及API版本兼容性,是避免CI/CD中断、token滥用和静默限流的前提。GPT-5.3-Codex在Python补全等结构化任务中表现突出,而GPT-5.4-turbo更适配泛化语义理解场景;二者差异源于训练数据分布与词向量空间重构,而非简单参数升级。实际工程中需结合文件类型、复杂度与成本阈值动态路由,并通过cu

weixin_34226706的博客 539

leetcode.1114-按序打印-多线程案例

使用信号量Semaphore ,先初始化信号量,不允许second和third函数运行,在first函数末尾调用release函数使得计数值加一,second函数可以运行;先声明两个AtomicInteger变量并初始化为0,使用他来控制first()和second(),second() 和third()之间的顺序关系。//在timeout的时间之内阻塞当前线程,时间一过则当前线程可以执行,在进入second和third方法时,提前进入循环去检验变量是否被增加为1,如果是,则进入方法,否则空转。

qq_51118755的博客 626

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1277

LeetCode 1114:按序打印

LeetCode 1114:按序打印题目描述解题思路代码实现SynchronizedReentrantLockCyclicBarrierSemaphore法一Semaphore法二总结 题目描述 给你一个类: public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); } }

香农三定律的博客 1104

​苹果开发者账号推送证书配置详细指南​

推送证书的配置是iOS应用实现消息推送的核心步骤。通过生成证书、配置描述文件、集成到服务器三大环节,开发者可快速为App启用APNs服务。建议优先使用更灵活的APNs Auth Key替代传统证书,以减少维护成本。确保拥有有效的苹果开发者账号(个人/公司账号),年费已缴纳。

2330

【物联网原理与应用】实验三:RFID低频卡实验——门禁系统

【物联网原理与应用】实验三:RFID低频卡实验——门禁系统

m0_74164458的博客 4001

LeetCode 1114 按序打印

需求 在多线程环境下按序打印firstsecondthird,并且保证打印顺序不会出错 使用信号量 #include<semaphore.h> class Foo { sem_t sem1; sem_t sem2; public: Foo(){ //sem_init 初始化信号量 //对信号量进行初始化; sem_init(&sem1,0,0);sem_init(&sem2,0,0); } void

ALITAAAA的博客 279

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 99

Leetcode 1114:按序打印

题目描述 我们提供了一个类: public class Foo { public void one() { print("one"); } public void two() { print("two"); } public void three() { print("three"); } } 三个不同的线程将会共用一个Foo实例。 线程 A 将会调用 one() 方法 线程...

weixin_35338624的博客 649

两轮差速机器人运动学模型

两轮差速底盘 1.1、底盘说明 两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 主要底盘有: 1、Turtlebot; 2、扫地机器人; 3、无人仓AGV小车; 4、轮椅; 底盘主要特点: 1、控制简单、里程计计算简单。 2、只能给定X方向速度、Z轴方向角速度。 1.2、底盘运动学分析 1.2.1、底盘模型 图1.2.1 常见的两轮差速底盘模型 1.2.2、机器人本身约束方程(物理特性) 图1.2.2 a 左侧是车的两个

su_fei_ma_su的博客 3万+

避坑指南:Vue2中使用TinyMCE5常见问题解决方案(含PowerPaste插件异常处理)

本文针对Vue2项目中集成TinyMCE 5富文本编辑器时遇到的高频疑难问题,提供了一套深度实战解决方案。内容涵盖环境搭建、资源路径配置、图片与视频上传处理、以及替代PowerPaste插件的自定义粘贴清理方案,旨在帮助开发者有效规避常见陷阱,构建稳定可靠的内容编辑功能。

weixin_29012677的博客 156

java关于多线程并发和异步操作由浅入深

目录前言一、初识多线程多线程最基本的两种实现方式**- 方式一:- 方式二:多线程优点:二、匿名函数实现无返回值的多线程异步调用三、CompletableFuture实现多线程异步调用无返回值的异步调用有返回值的异步调用四、四种线程池的使用1.newFixedThreadPool定长线程池2.CachedThreadPool可缓存线程池3.newSingleThreadExecutor单线程化线程池4. newScheduledThreadPool周期性线程池无返回值的延时线程示例:有返回值的延时线程示例:

西凉的悲伤博客 8531

Android11原生设置屏幕亮由Gamma变化改为线性变化

从Android9 开始屏幕亮度调解变成非线性变化,这样的话就会出现 之前亮度变化很小,到后面时变化亮度很快; 修改为线性变化,只需要修改 ./frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache L

Android 4926

基于Claude Code的AI循环工程:自动化代码测试与修复实践

在软件工程领域,自动化测试与持续集成是保障代码质量的核心实践。其原理在于通过预设的测试用例,对代码功能进行系统化验证,确保每次修改不会引入回归错误。这一技术价值在于显著提升开发效率与软件可靠性,广泛应用于单元测试、集成测试及CI/CD流水线。随着大语言模型能力的演进,AI编程助手如Claude Code,已能理解测试错误信息并进行逻辑推理,为实现“测试-修复”循环自动化提供了新范式。本文聚焦的Loop Engineering(循环工程)正是这一趋势的典型应用,它通过构建由主控脚本、任务描述文件和初始代码组成

weixin_34122604的博客 637

本地部署大模型:dgx-spark-ai项目硬件选型、部署与私有化AI构建指南

大语言模型(LLM)的本地部署是当前AI工程实践中的重要方向,其核心原理在于将模型权重与计算过程完全置于用户可控的硬件环境中。这项技术的核心价值在于实现了数据主权与隐私安全,避免了云端服务的延迟、持续订阅成本及数据外泄风险。从技术实现看,本地部署的关键在于硬件选型与软件环境适配,尤其是NVIDIA GPU的CUDA生态、显存容量与内存带宽的匹配。在应用场景上,本地化部署特别适合对数据敏感性要求高的领域,如企业内部代码助手、金融分析或医疗研究,能够支持私有化模型微调与定制化工作流构建。本文以dgx-spark

weixin_42531579的博客 505

RK3588部署YOLO模型 包含模型量化+npu轻量化+ubuntu+RGA图像加速和多线程模型加速 包源码

本专栏为深度学习部署全栈学习体系,包含68篇由浅入深的教程,专为零基础学习者设计。内容涵盖TensorRT与RK3588平台部署技术,包含Jetson系列和RK系列硬件部署实战,采用"理论+源码+实战"三位一体的教学模式。学习路径从基础环境搭建到模型优化、容器化部署、多硬件平台适配,最终掌握工业级AI部署能力。特色包括C++基础教学、Docker容器化、INT8量化、多线程优化等核心技术,并附带YOLOv5、人脸检测、车牌识别等多个实战项目源码。适合算法工程师转部署方向、嵌入式开发者及对

FJN110的博客 3732

AI编程助手Claude Code的7大陷阱与规避策略

大型语言模型驱动的AI编程助手正成为开发者提升效率的重要工具,其核心原理是基于海量代码数据进行模式识别与文本生成。这类工具在代码补全、函数生成等场景展现出显著的技术价值,但同时也带来了新的工程挑战。开发者需警惕其生成的代码可能存在的逻辑错误、安全漏洞和性能反模式,特别是在处理业务逻辑、项目结构和第三方依赖时。本文聚焦于AI编程助手在实际应用中的典型陷阱,如过度信任生成代码、破坏性重构、幻觉依赖等问题,并提供了具体的识别方法与规避策略,旨在帮助开发者建立安全高效的人机协作心智模型,将AI作为辅助工具而非替代品

weixin_30315905的博客 339

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

B站2019秋招技术岗笔试题复盘:四个方向的考点与解法

在互联网技术面试中,高并发、缓存策略与性能优化是衡量工程师系统设计能力的关键指标。无论是前端事件循环机制,还是后端应对缓存穿透、击穿与雪崩的策略,核心都在于理解底层原理并应用于实际业务。视频平台作为典型的高并发场景,在弹幕推送、播放体验与资源调度等环节,对工程师的全链路技术素养提出更高要求。从Linux故障排查、Kubernetes容器调度到Android生命周期管理与弱网优化,各技术方向都围绕稳定性与体验展开。B站2019秋招技术岗笔试题正是从这四个方向切入,深入考察事件循环、HTTP缓存、Vue响应式、

weixin_34320724的博客 397

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

7个免费AI编程平台实战指南:替代Cursor的开源编码方案

大模型编程辅助已从高门槛商业服务走向普惠化基础设施。随着开源代码大模型(如CodeLlama、Qwen2-Code、DeepSeek Coder)推理成本大幅下降,本地化部署与轻量API调用成为可行路径。其核心原理在于将代码理解、补全、解释、重构等能力解耦为可组合的服务模块,依托上下文建模、领域微调和工程友好型接口实现稳定输出。技术价值体现在去中心化架构带来的故障隔离性、数据主权可控性及长期使用成本趋近于零。典型应用场景包括学生代码辅导、初创团队CI集成、离线环境安全审查及遗留系统现代化改造。本文聚焦7个经

diaocuiguo2493的博客 417

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

AI时代程序员的生存法则:从写代码到构建数字因果链

编程正经历从语法执行到系统思维的本质跃迁。随着GitHub Copilot等AI编码工具普及,基础语法记忆与重复性开发需求持续萎缩,但对数据流建模、错误语义解析、资源博弈意识等底层能力的要求却显著提升。现代编码的核心已不再是‘写出能跑的代码’,而是构建可解释、可追溯、可协同的数字因果链——这要求开发者兼具终端直觉、日志即文档意识与部署即实验思维。在AI原生应用、边缘计算与合规敏感系统等新兴场景中,真正稀缺的是能校验AI输出偏差、调试跨发行版兼容性、设计可观测性日志体系的实践者。本文聚焦于这一能力进化路径,揭

weixin_33796177的博客 485

Qwen3.6-Plus:面向工程落地的国产编程模型深度解析

编程辅助模型正从‘代码补全’迈向‘工程意图理解’——这一技术演进本质是将大模型能力与真实开发场景深度耦合。其核心原理在于上下文感知增强、AST-aware语义建模与可验证代码契约机制,显著提升生成代码的可维护性、安全性与风格一致性。技术价值不仅体现为效率跃升,更在于降低工程决策成本、缩短PR评审周期、强化合规边界控制。典型应用场景覆盖IDE实时辅助、CI/CD智能守门、遗留系统现代化重构及多语言客户端自动生成。本文聚焦Qwen3.6-Plus这一国产编程模型在上下文感知与工程化落地方面的实践突破,解析其如何

weixin_30530939的博客 359

前端学习规划

HTML5:CSS3:JavaScript:渲染机制:事件循环:安全机制:存储方案:HTTP/HTTPS:WebSocket:WebRTC:打包工具:任务管理:代码质量:自动化:部署策略:监控体系:加载优化:运行时优化:渲染优化:React:Vue:Angular:移动端:桌面端:小程序:数据流模式:异步处理:持久化:Node.js基础能力:数据库:API设计:BFF层(Backend For Frontend)聚合层:性能优化:安全控制:函数计算:边缘计算:Web与原生通信:原生功能调用:Hybrid A

zxz86的博客 923

力扣 1114. 按序打印 C++多线程

https://leetcode-cn.com/problems/print-in-order/ 思路:条件变量就行了。 class Foo { public: Foo() { } void first(function<void()> printFirst) { unique_lock<mutex> lck(mtx); cv.wait(lck,func1); // printFirst()

xiji333的博客 495

LeetCode 1114 按序打印(多种解决)

题目 代码实现: 写法一: class Foo { public Foo() { } volatile int count = 1; public void first(Runnable printFirst) throws InterruptedException { count++; // printFirst.run() outputs "first". Do not change or remov

欧阳子遥的博客 706

LeetCode:按序打印【1114】

LeetCode:按序打印【1114】 题目描述 我们提供了一个类: 1 2 3 4 5 publicclassFoo { publicvoidone() { print("one"); } publicvoidtwo() { print("two"); } publicvoidthree() { print...

weixin_30847271的博客 278

【LeetCode】1114. Print in Order(多线程:按序打印)

LeetCode新出了一类多线程的题目,主要考察的是对编程语言中多线程的用法以及多线程的算法,目前只有四题,这篇博客是对第一个1114这个多线程题目的分析。 题目 Suppose we have a class: public class Foo { public void first() { print("first"); } public void second() { print...

wangyao2221的博客 1207
上一篇: 数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)
下一篇: 数据结构与算法之字符串: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值