代码题-判断循环依赖

2023-11-12

interface Module {
  name: string;
  imports?: Module[];
}

const moduleC: Module = {
  name: 'moduleC'
};

const moduleB: Module = {
  name: 'moduleB',
  imports: [moduleC]
};

const moduleA: Module = {
  name: 'moduleA',
  imports: [moduleB]
};

/**
 * 检查一个模块内部是否有循环引用现象
 * @param module 要检查的模块
 * @param visited 一个集合用于保存已经访问过的模块名称
 * @param stack 一个集合用于保存DFS当前路径中的模块名称
 * @returns true 表示有循环引用, false 表示无循环引用
 */
function checkCircleImport(module: Module, visited: Set<string> = new Set(), stack: Set<string> = new Set()): boolean {
  if (stack.has(module.name)) return true; // 循环依赖
  if (visited.has(module.name)) return false; // 已经访问过

  visited.add(module.name);
  stack.add(module.name);

  if (module.imports) {
    for (let importedModule of module.imports) {
      if (checkCircleImport(importedModule, visited, stack)) {
        return true;
      }
    }
  }

  stack.delete(module.name);
  return false;
}

// test:
const res = checkCircleImport(moduleA);
console.log(res);  // 应该输出false,因为没有循环依赖

注意:我们使用了两个集合 visitedstackvisited 用于记录已经检查过的模块,以避免重复检查;stack 用于记录当前的DFS路径,如果在路径中再次碰到同一个模块,那么就存在循环依赖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码题-判断循环依赖 的相关文章

  • Analytics.js:“auto”参数在跟踪对象创建方面有何作用?

    我刚刚切换到新的 Google Analytics 分析 通用分析 https support google com analytics answer 2790010 hl en GB平台 使用新的 javascript API 分析 js
  • 如何使用Vue3中的ref访问父组件中的子组件方法?

    我正在尝试使用 vue3 和 ref 方法访问父组件中的子方法 但它返回一个错误 未捕获的类型错误 addNewPaper value savePaper 不是函数 下面是我的代码 请指导我哪里错了 子组件
  • 无限水平滚动 Div

    我需要一个 div 当您将鼠标进一步向右或向左移动时 它会水平滚动 我发现 Smooth Div Scroll 插件 http www smoothdivscroll com 非常接近我的需要 然而 这存在一些问题 我需要能够使滚动元素从设
  • 将 C# 3D 数组移植到 JS 3D 数组

    我开发了一个 C 库 它在 3 个项目中使用 这些项目在特定的代码段中中继 不过 我仍然需要在 javascript 中使用该代码 所以将其导出 问题是 我认为我无法复制同样的逻辑 比如这个问题我想了好几天也没有得出答案 在 C 库中 我有
  • .addClass 仅添加到无序列表中单击的项目符号

    我有一个简短的无序列表 其中有两个项目符号 我添加了一些 Javascript 这样当我单击项目符号时 它会向其中添加一个类 问题是 它将该类添加到所有现有的 li 中 而不仅仅是我单击的那个 这是 JSFiddle http jsfidd
  • Javascript If 语句的语义是什么

    我一直认为 if 语句本质上比较它的论点类似于 true 然而 Firebug 中的以下实验证实了我最担心的事情 在编写 Javascript 15 年之后 我仍然不知道 WTF 发生了什么 gt gt gt true false gt g
  • 缩放对象上的弹跳动画

    拥有对象比例 然后在返回到原始比例因子之前以该比例因子执行弹跳动画的最佳方法是什么 我意识到我可以做一些事情 比如将其缩放到 2 2 然后 1 8 然后 2 0 但我正在寻找一种方法 您只需在比例因子上执行弹跳动画 因为我的比例因子会改变
  • 表格中与文本一起内嵌 D3 迷你图

    假设有一个这样的表 var data Orange Orange 6 3 3 2 5 Apple Red 6 2 6 5 5 Grape Purple 9 1 2 3 1 我希望将字符串表示为字符串 但将数字数组表示为 D3 折线图 如果这
  • 获取与请求

    我正在使用 JSON 流并尝试使用 fetch 来使用它 该流每隔几秒发出一些数据 仅当流关闭服务器端时 使用 fetch 来使用流才可以访问数据 例如 var target the url var options method POST
  • 如何在phonegap中同时使用相机API选择多个图像?

    如何同时选择或拾取多个图像phonegap camera API使用时Camera DestinationType FILE URI 我一次只能选择一张图像 我可以使用以下命令在 SD 卡中选择多个文件 包括 txt pdf this ht
  • 如果没有其他函数链接到承诺,则默认行为

    我想打开一个 确认您要取消对话框 如果没有链接其他功能 则默认导航回页面 window history back 如果我传递回调 我可能会这样做 function openCancelModal form callback if form
  • 我想在使用 Jest Snapshots 时获得图像文件名/路径

    我已经开始使用Jest https facebook github io jest 在一个新项目中有很多 我现在正在使用Snapshot https facebook github io jest docs tutorial react h
  • 如何沿着 Parse Promise 链传递额外数据[重复]

    这个问题在这里已经有答案了 在我的 Parse Cloude 代码中 我需要运行几个连续的查询 每个查询都使用 find Example var promise firstQuery get objectId then function r
  • SVG 沿圆弧添加文本

    我正在尝试绘制 SVG 径向饼图 如下所述 色卡 https stackoverflow com a 18210763 1395178 现在我尝试将文本与圆弧一起添加到每个切片 我试图展示Text 1具有与 M 和 A 值完全相同的 x y
  • 在 Node.js 中封装 require 可以解决相对路径调用

    我正在尝试创建一个 require 包装器来加载依赖项 但我发现很难让它像原始的 require 函数一样工作 当路径是相对路径时 包装器无法解析为正确的路径 因为我的加载程序和调用程序文件不在同一文件夹中 这是一个简化的描述 index
  • Angular JS:当我们已经有了具有作用域的指令控制器时,指令的链接函数需要什么?

    我需要对范围和模板执行一些操作 看来我可以在以下任何一个中做到这一点link函数或controller函数 因为两者都可以访问该范围 什么时候我必须使用link功能而不是控制器 angular module myApp directive
  • 有条件地使用 Node.js 提供两个 React 构建

    我有两个基于设备向客户端提供服务的 React 应用程序 我使用 Node js 和 Express 来实现这一点 我借了static资产处理部分来自这个问题在这里 https stackoverflow com questions 644
  • 如何在 jest 中测试调用和应用函数?

    这是我的callnapply js file const callAndApply caller object method nameArg ageArg tShirtSizeArg method call object nameArg a
  • 如何在JAVascript中删除具有相同ID但display='block'和display='none'的div

    我有超过 1 个 div 具有相同的 id 但其中一个具有 display block 和其他人有显示 无 我想删除所有具有 display none 的 div 请告诉最简单的方法 文档中多个元素具有相同的 id 是违反 W3 标准的 请
  • 如何在没有消息时隐藏 Bootstrap 警报框

    我用 Bootstrap 做了一个简单的警报框 如下所示 div class alertBox span class alert alert info bag session username span div When there is

随机推荐

  • 在 Linux 系统中查找 MAC 地址的方法

    参考文章 多种方法在Linux上找到MAC地址 引言 MAC Media Access Control 地址是网络设备 如网卡 的唯一标识符 用于在局域网中进行通信 在 Linux 系统中 有几种方法可以查找设备的 MAC 地址 在本文中
  • 线性代数(六)——二次型

    文章目录 前言 二次型是什么 二次型的表示 合同矩阵与合同二次型 正定二次型 正定矩阵 二次型的题型 前言 一直对二次型和线性代数的关系不解 导致一系列的知识点因为没有理解而常常忘记 在这里对二次型进行梳理 希望可以加深对二次型的印象 二次
  • 【软件测试】POST请求包含哪些参数

    POST请求包含哪些参数 HTTP 协议是以 ASCII 码传输 建立在 TCP IP 协议之上的应用层规范 规范把 HTTP 请求分为三个部分 请求行 状态行 URL 请求头 Headers 请求体 消息主体 Body 协议规定 POST
  • 容器编排学习(一)容器技术

    一 容器 1 Linux 容器的起源 容器的起源可以追溯到1979年 UNIX 系统中提供的chroot命令 容器的最初的设计目标是为了隔离计算机中的各类资源以便降低软件开发 测试阶段的风险 或者充当蜜罐 吸引黑客的攻击 以便监视黑客的行为
  • 计算机组成原理笔记

    CPU的功能和结构 运算器 对数据进行加工 算术逻辑单元ALU 暂存寄存器 通用寄存器 累加寄存器ACC 程序状态字寄存器PSW 移位器 计数器 控制器 取指令 分析指令 执行指令 中断处理 程序计数器PC 指令寄存器IR 指令译码器 时序
  • 第53步 深度学习图像识别:Bottleneck Transformer建模(Pytorch)

    基于WIN10的64位系统演示 一 写在前面 1 Bottleneck Transformer Bottleneck Transformer 简称 BotNet 是一种深度学习模型 在2021年由Google的研究人员在论文 Bottlen
  • 【Mysql】数据库第三讲(表的约束、基本查询语句)

    表的约束和基本查询 1 表的约束 1 1 空属性 1 2默认值 1 3列描述 1 4 zerofill 1 5主键 1 6 自增长 1 7 唯一键 1 8外键 1 表的约束 真正约束字段的是数据类型 但是数据类型约束很单一 需要有一些额外的
  • 腾讯应用宝米大师直购模式支付流程以及服务端php回调校验

    一 米大师简介 1 米大师 Midas 为腾讯官方唯一虚拟支付平台 2 YSDK已经内置了米大师 Midas 支付模块 游戏开发者接入YSDK后 可以通过相应的配置开启米大师的支付功能 并调用YSDK已经封装好的接口 即可快速实现支付能力
  • windows 10 下安装labelme出错

    请大件帮我看看问题在哪 谢了
  • MongoDB的身份验证

    1 当开启了安全检查之后 只有通过身份认证的用户才能进行数据的读写操作 2 admin和local是两个特殊的数据库 它们当中的用户可对任何数据库进行操作 3 经认证后 管理员用户可对任何数据库进行读写操作 同时能执行只有管理员才能执行的命
  • 关于进制(十进制,二进制,八进制,十六进制)

    进制 十进制 在日常生活中使用 满10进1 计数 0 1 2 3 4 5 6 7 8 9 10 11 12 18 19 20 单位数字有10个 0 9 二进制 满2进1 计数 0 1 10 11 100 101 110 111 单位数字有2
  • 新版来啦|ShardingSphere 5.4.0 重磅发布

    Apache ShardingSphere 本周迎来了 5 4 0 版本的发布 该版本历时两个月 共合并了来自全球的团队和个人累计 1271 个 PR 新版本在功能 性能 测试 文档 示例等方面都进行了大量的优化 本次更新包含了不少能够提升
  • CUDA向量加法示例

    CUDA向量相加示例 贺志国 下面以向量加法为例 介绍CUDA实现代码 以下是具体代码vector add cu 我的版本除CUDA相关函数外 其他代码均以C 的方式实现 并且尽可能调用STL库的数据结构和算法 注意 CUDA核函数内部的日
  • delphi 获取有输入焦点的活动窗口信息

    var wintext array 0 MAXBYTE of Char WdChar array of Char focuswhd THandle processId Pointer threadid Cardinal GUITHREADI
  • c语言入门---调试技巧

    目录 什么是bug 调试是什么 调试的基本步骤是什么 调试是什么 调试的基本步骤是什么 Debug和release的区别 windows的调试介绍 调试的准备 调试的操作 1 F5 2 F9 3 F10 4 F11 调试的时候查看程序当前的
  • kali linux基本命令

    文章目录 shell 什么是shell 查看shell shell与终端的区别 VIM编辑器 Linux常用命令 shell 什么是shell 在计算机科学中 shell俗称外壳 能够接收用户的命令并翻译给操作系统执行 是用户与操作系统 内
  • CryptoPP的LC_RNG算法的使用

    随机数发生器是密码学的一个重要原语 密码学库CryptoPP中提供了一些随机数发生器算法 如下图所示 今天 介绍一些其中LC RNG算法的使用 该库中的LC RNG算法就是著名的线性同余发生器算法 该算法由于执行效率高而被广泛使用 C语言库
  • @Conditional 初学

    点击 Conditional Target ElementType TYPE ElementType METHOD Retention RetentionPolicy RUNTIME Documented public interface
  • win10安装Tensorflow1.14.0 CUP版

    安装cpu版本 python3 6 12 tensorflow1 14 0 numpy1 16 0 python tensorflow 和 numpy之间版本要相对应 这很重要 不然可能会装不上 这是尝试了4天后的可行搭配 目 录 预备备
  • 代码题-判断循环依赖

    interface Module name string imports Module const moduleC Module name moduleC const moduleB Module name moduleB imports