JS在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
最小矩阵宽度(从第一列开始一列列加,直到判断子矩阵内包含数组的所有元素) 发布于:2025-04-16 19:10 最小交付时间(二分+回溯:先将数组排序,最小值start=Math.max(arr),最大值end = arr.reduce,回溯中创建一个新的工人数组,每次遍历数组时将数组中的每一个元素都尝试分配给worker[i]) 发布于:2025-04-16 18:53 阿里巴巴找黄金宝箱Ⅳ(单调栈:栈中存储单调递减的元素的集合,当找到比栈顶元素大的元素时,循环出栈直到栈顶元素不小于当前元素) 发布于:2025-04-15 17:47 找出经过特定点的路径长度(dfs+回溯) 发布于:2025-04-14 16:32 计算最接近的数(1.输入处理;2.对数组进行深拷贝,然后对新数组进行排序,之后在进行后续操作) 发布于:2025-04-14 15:11 MELON的难题(01背包问题:先判断数组和是否为偶数,如果为偶数直接输出-1,target=sum/2 状态转移方程dp[i]=Math.min(dp[i],dp[i-1]+1) 发布于:2025-04-11 17:29 简易内存池(模拟,双指针) 发布于:2025-04-11 17:12 通过软盘拷贝文件 这是一个典型的 0-1 背包问题的变体: 问题描述: 有一个容量为 1.44MB(1474560字节)的软盘 每个块大小为 512 字节 需要在有限容量内存储最大的文件字节总和 关键点: 文件大小以字节为单位 存储空间以块为单位 即使文件不足一个块,也要占用整个块的空间 动态规划解析: 状态定义:dp[i] 表示使用 i 个块时能存储的最大字节数 状态转移:对每个文件,可以选择放入或不放入 约束条件:总块数不能超过软盘容量 时间复杂度:O(n maxSize),其中: n 是文件数量 maxSize 是软盘最大块数(约2880块) 发布于:2025-04-11 16:39 正整数到excel编号之间的转换(对num先进行取余操作,取余之后的值就是字母a往后的偏移量,letter=String.fromCharCode('a'.charCodeAt(0)+remain),将这个字母放到结果队首,然后对num进行整除,循环直到num为0) 发布于:2025-04-10 17:46 最少交换次数(滑动窗口:先算出整个数组内<k的个数,作为窗口大小,然后再算出0-window内>=k的个数,作为res的初始值,然后滑动窗口,当arr[left]>=k时,res--,当arr[right]>=k时,res++) 发布于:2025-04-10 17:40 TLV解析 Ⅱ(字符串操作) 发布于:2025-04-10 16:24 最少有多少个小朋友了(相同的数字的个数/(相同个数+1)*(相同个数+1)) 发布于:2025-04-10 15:11 硬件产品销售方案(回溯 backtrack(path,val,sum)=>) 发布于:2025-04-09 18:40 猴子爬山(动态规划:状态转义方程dp[i]=dp[i-1]+dp[i-3]) 发布于:2025-04-09 18:14 检测工具代码 发布于:2025-04-09 18:03 检查是否存在满足条件的数字组合)(双指针,然后多重判断) 发布于:2025-04-09 17:45 阿里巴巴找黄金宝箱III(遍历数组,用map储存arr[i]上一次出现的下标,如果当前下标位置i-map.get(i)<=k,直接输出left) 发布于:2025-04-09 17:07 阿里巴巴找黄金宝箱II(数组排序,每次都找最大的减) 发布于:2025-04-09 16:48 全量和已占用字符集(字符串操作) 发布于:2025-04-09 16:34 微服务的集成测试(dfs:当扫描到第i行的第i个元素为1时,就递归dfs,sum+=Math.max(max,dfs(j))) 发布于:2025-04-09 16:25 经典屏保问题(判断是否反向:右下角坐标值为(x+50,y+25),当右下角撞到下面或者右边的墙时,就将x轴/y轴的移动方向反向,左上角同理。) 发布于:2025-04-08 18:37 阿里巴巴找黄金宝箱(I)(左右数组的和,如果左右数组的和相等,就输出) 发布于:2025-04-08 16:57 告警抑制(Map) 发布于:2025-04-08 16:35 过滤组合字符串(全排列:回溯) 发布于:2025-04-03 18:56 分糖果(判断是否为偶数,如果为偶数,操作次数+1,n=n/2;如果为奇数,判断(n+1)/2是否为偶数,如果是偶数,n=n+1,res++,否则n=n-1,res++) 发布于:2025-04-03 18:24 查找接口成功率最优时间段(用前缀和求出[left,right]区间的和,然后求平均值,和输入值比较,如果<=平均值,就移动右指针,如果>平均值,说明当前位置有一个当前最大的区间,比较这个区间是否为最大,如果不是则继续,如果是最大,则更新res结果;如果和当前的i最大值一样,那就将两个都放入到res中。最后,如果left和right不相等,说明最后一个窗口没处理完成,需要单独处理) 发布于:2025-04-03 18:15 游戏分组(dfs // 深度优先搜索函数 // 参数说明: // idx: 当前考虑的数组索引 // level: 当前已选择的数字个数 // subSum: 当前已选择数字的和 // totalSum: 整个数组的总和) 发布于:2025-04-03 17:18 新学校选址(找到一个数组排序后的中位数,如果是基数就是这个数,如果是偶数就是这个数的前一个数) 发布于:2025-04-03 16:38 绘图机器(从(0,0)到第一个点时,是先走横坐标,再走纵坐标,所以第一个点的面积应该为0) 发布于:2025-04-02 19:14 素数之积(判断是否为素数的函数:function isPrime(n) { if (n < 2) return false; for (let i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) return false; } return true; } 发布于:2025-04-02 17:43 考勤信息(滑动窗口统计七天之内的考勤状况) 发布于:2025-04-02 17:27 打印机队列(简单的数组模拟) 发布于:2025-04-02 16:29 JS AES128加解密 发布于:2025-04-03 15:28 找出重复代码】(二维动态规划:定义二维数组dp,初始值设为0,循环两个字符串,如果str1[i]=str2[j],dp[i+1][j+1]==dp[i][j]+1;使用maxLength定义当前最大的公共子串长度,如果dp[i+1][j+1]>maxLength,记录maxLength和当前结束位置i+1。循环后,根据maxLength和结束位置p,确定silce的范围 发布于:2025-04-01 19:24 【二叉树中序遍历】(用栈将二叉树的结构处理出来。然后中序遍历) 发布于:2025-04-01 19:08 【最小调整顺序次数】(模拟队列操作:当插入操作为头操作时,如果数组不为空,就不是排序状态。尾插入不影响;当移除元素时,如果当前队列是有序的 ,就不需要操作,否则就需要操作,ans++) 发布于:2025-04-01 18:29 二元组个数】(用map存储第一个数组中出现的元素及个数,然后遍历第二个数组,如果遇到map中的元素,ans+=map.get()) 发布于:2025-04-01 18:02 【文件目录大小】(递归:先读取每个文件的信息,解析每行输入的三个部分:id,size,child并将处理过后的放入files中,files:{id,size,child}。然后递归计算目标目录的大小:自定义一个递归函数 getSize,将目标目录设为root节点,向下递归子文件夹,如果有子文件夹就递归计算所有子节点的大小并累加,最后返回结果) 发布于:2025-04-01 17:49 华为OD机试真题 Python 实现【水库蓄水问题】(变体接雨水问题,用双指针遍历数组,然后将子数组内的每一个数字能接到的雨水相加(如果当前位置数字 小于左右边界的最小值,能够接水),如果有多个位置接的雨水相同,保留right-left最小的) 发布于:2025-04-01 17:23 找出两个整数数组中同时出现的整数】(用map存储第一个数组中的元素,然后再循环第二个数组,当遇到map中有的数字时,记录下这个数字。再创建新的Map,按出现次数分组存储数字// 获取当前数字及其在第一个数组中的出现次数// 将数字添加到对应次数的组中,并保持组内数字有序;// 获取所有出现次数并按升序排序// 按格式输出结果) 发布于:2025-04-01 16:47 模拟消息队列(两个数组,一个用来存消息,一个用来存接受者,接受者的中包括订阅时间取消时间和能接收到的消息,正序循环message数组,在逆序循环接受者数组,每当有发送消息的时间在订阅和取关之间时,把这个消息放到消息队列中) 发布于:2025-04-01 16:22 【投篮大赛】(简单字符串操作) 发布于:2025-04-01 16:05 【数值同化】(广度优先搜索,搜索能够到达的所有格子,然后遍历矩阵找出无法到达的地区) 发布于:2025-04-01 15:29 数字加减游戏(数学问题:先判断目标-初始是否能被b整除,如果能直接输出0.如果不能就每次判断初始值+a*x或初始值-a*x是否能整除b,如果能,就时最优解) 发布于:2025-04-01 15:10 数组二叉树(// 遍历树中的所有节点,寻找最小的叶子节点 // 判断当前节点是否为叶子节点,需满足以下条件: // 1. 节点值不为 -1(不是空节点) // 2. 节点值小于当前找到的最小叶子值 // 3. 左子节点不存在(超出数组范围或为-1) // 4. 右子节点不存在(超出数组范围或为-1) // 更新最小叶子节点的索引和值,找到叶子节点后,根据叶子节点不断向上推导出父节点,直到找到根节点。对于索引i,其父节点索引为 floor((i-1)/2)) 发布于:2025-04-01 14:56 【招聘】计算至少需要的面试官数量( // 核心算法思路: // 1. 首先对所有面试时间区间按开始时间排序 // 2. 检查相邻区间是否存在时间重叠 // 3. 对于重叠的区间,需要额外的面试官 // 4. 最后根据重叠情况和每个面试官的面试次数限制(m)计算所需面试官总数) 发布于:2025-03-31 18:44 查找一个有向网络的头节点和尾节点(读取输入数据并解析 统计每个节点的入度和出度 使用Map存储节点的入度和出度 每处理一条边,同时更新起点和终点的度数 入度为0的节点是起点 出度为0的节点是终点 终点需要降序排序 检查是否存在起点和终点 收集所有起点和终点 对终点进行排序 输出结果) 发布于:2025-03-31 17:51 数字序列比大小(田忌赛马:首先对两个数组进行升序排序 对arrA中的每个元素: 在arrB中查找第一个大于等于它的元素 如果找到,使用该位置的前一个元素进行匹配(得1分) 如果找不到,使用arrB的最后一个元素(得-1分)) 发布于:2025-03-31 17:20 寻找最大价值的矿堆(BFS函数实现: 参数:起始位置(i,j) 功能: 计算从起始位置开始的连通区域的和 使用BFS遍历所有相邻的位置 将已访问的位置标记为0 返回连通区域的和 主要流程: 读取矩阵数据 遍历矩阵的每个位置 对未访问的位置进行BFS 更新最大连通区域的和 关键点: 使用0标记已访问的位置 只处理值大于0的位置 考虑四个方向的相邻位置 使用Math.max更新最大和) 发布于:2025-03-31 16:53 仿LISP运算(遍历输入字符串的每个字符,遇到右括号或空格时,处理已收集的字符 遇到右括号时,进行运算,收集非括号和空格的字符;运算时从栈中弹出两个操作数和一个运算符,根据运算符执行相应的运算,将运算结果压入栈中,处理除数为0的特殊情况) 发布于:2025-03-31 16:35 [更多]
显示目录



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

域 -

稳定性: 2 - 不稳定

Node.js域包含了能把不同的IO操作看成单独组的方法。如果任何一个注册到域的事件或者回调触发error事件,或者抛出一个异常,则域就会接收到通知,而不是在process.on('uncaughtException')处理程序中丢失错误的上下文,也不会使程序立即以错误代码退出。

警告:不要忽视错误!

你不能将域错误处理程序看做错误发生时就关闭进程的一个替代方案。

根据JavaScript中抛出异常的工作原理,基本上没有方法可以安全的“回到原先离开的位置”,在不泄露引用,或者不造成一些其他未定义的状态下。

响应抛出错误最安全的方法就是关闭进程。一个正常的服务器会可能有很多活跃的连接,因为某个错误就关闭所有连接显然是不合理的。

比较好的方法是给触发错误的请求发送错误响应,让其他连接正常工作时,停止监听触发错误的人的新请求。

按这种方法,和集群(cluster)模块可以协同工作,当某个进程遇到错误时,主进程可以复制一个新的进程。对于Node程序,终端代理或者注册的服务,可以留意错误并做出反应。

举例来说,下面的代码就不是好办法:

// XXX WARNING!  BAD IDEA!

var d = require('domain').create();
d.on('error', function(er) {
  // The error won't crash the process, but what it does is worse!
  // Though we've prevented abrupt process restarting, we are leaking
  // resources like crazy if this ever happens.
  // This is no better than process.on('uncaughtException')!
  console.log('error, but oh well', er.message);
});
d.run(function() {
  require('http').createServer(function(req, res) {
    handleRequest(req, res);
  }).listen(PORT);
});

通过使用域的上下文,并将程序切为多个工作进程,我们能够更合理的响应,处理错误更安全:

// 好一些的做法!

var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;

if (cluster.isMaster) {
  // In real life, you'd probably use more than just 2 workers,
  // and perhaps not put the master and worker in the same file.
  //
  // You can also of course get a bit fancier about logging, and
  // implement whatever custom logic you need to prevent DoS
  // attacks and other bad behavior.
  //
  // See the options in the cluster documentation.
  //
  // The important thing is that the master does very little,
  // increasing our resilience to unexpected errors.

  cluster.fork();
  cluster.fork();

  cluster.on('disconnect', function(worker) {
    console.error('disconnect!');
    cluster.fork();
  });

} else {
  // the worker
  //
  // This is where we put our bugs!

  var domain = require('domain');

  // See the cluster documentation for more details about using
  // worker processes to serve requests.  How it works, caveats, etc.

  var server = require('http').createServer(function(req, res) {
    var d = domain.create();
    d.on('error', function(er) {
      console.error('error', er.stack);

      // Note: we're in dangerous territory!
      // By definition, something unexpected occurred,
      // which we probably didn't want.
      // Anything can happen now!  Be very careful!

      try {
        // make sure we close down within 30 seconds
        var killtimer = setTimeout(function() {
          process.exit(1);
        }, 30000);
        // But don't keep the process open just for that!
        killtimer.unref();

        // stop taking new requests.
        server.close();

        // Let the master know we're dead.  This will trigger a
        // 'disconnect' in the cluster master, and then it will fork
        // a new worker.
        cluster.worker.disconnect();

        // try to send an error to the request that triggered the problem
        res.statusCode = 500;
        res.setHeader('content-type', 'text/plain');
        res.end('Oops, there was a problem!\n');
      } catch (er2) {
        // oh well, not much we can do at this point.
        console.error('Error sending 500!', er2.stack);
      }
    });

    // Because req and res were created before this domain existed,
    // we need to explicitly add them.
    // See the explanation of implicit vs explicit binding below.
    d.add(req);
    d.add(res);

    // Now run the handler function in the domain.
    d.run(function() {
      handleRequest(req, res);
    });
  });
  server.listen(PORT);
}

// This part isn't important.  Just an example routing thing.
// You'd put your fancy application logic here.
function handleRequest(req, res) {
  switch(req.url) {
    case '/error':
      // We do some async stuff, and then...
      setTimeout(function() {
        // Whoops!
        flerb.bark();
      });
      break;
    default:
      res.end('ok');
  }
}

错误对象的附加内容

任何时候一个错误被路由传到一个域的时,会添加几个字段。

  • error.domain 第一个处理错误的域
  • error.domainEmitter 用这个错误对象触发'error'事件的事件分发器
  • error.domainBound 绑定到domain的回调函数,第一个参数是error。
  • error.domainThrown boolean值,表明是抛出错误,分发,或者传递给绑定的回到函数。

隐式绑定

新分发的对象(包括流对象(Stream objects),请求(requests),响应(responses)等)会隐式的绑定到当前正在使用的域中。

另外,传递给底层事件循环(比如fs.open或其他接收回调的方法)的回调函数将会自动的绑定到这个域。如果他们抛出异常,域会捕捉到错误信息。

为了避免过度使用内存,域对象不会象隐式的添加为有效域的子对象。如果这样做的话,很容易影响到请求和响应对象的垃圾回收。

如果你想将域对象作为子对象嵌入到父域里,就必须显式的添加它们。

隐式绑定路由抛出的错误和'error'事件,但是不会注册事件分发器到域,所以domain.dispose()不会关闭事件分发器。隐式绑定仅需注意抛出的错误和 'error'事件。

显式绑定

有时候正在使用的域并不是某个事件分发器的域。或者说,事件分发器可能在某个域里创建,但是被绑定到另外一个域里。

例如,HTTP服务器使用正一个域对象,但我们希望可以每一个请求使用一个不同的域。

这可以通过显式绑定来实现。

例如:

// create a top-level domain for the server
var serverDomain = domain.create();

serverDomain.run(function() {
  // server is created in the scope of serverDomain
  http.createServer(function(req, res) {
    // req and res are also created in the scope of serverDomain
    // however, we'd prefer to have a separate domain for each request.
    // create it first thing, and add req and res to it.
    var reqd = domain.create();
    reqd.add(req);
    reqd.add(res);
    reqd.on('error', function(er) {
      console.error('Error', er, req.url);
      try {
        res.writeHead(500);
        res.end('Error occurred, sorry.');
      } catch (er) {
        console.error('Error sending 500', er, req.url);
      }
    });
  }).listen(1337);
});

domain.create()

  • return: {Domain}

用于返回一个新的域对象。

Class: Domain

这个类封装了将错误和没有捕捉到的异常到有效对象功能。

域是EventEmitter的子类. 监听它的error事件来处理捕捉到的错误。

domain.run(fn)

  • fn {Function}

在域的上下文运行提供的函数,隐式的绑定了所有的事件分发器,计时器和底层请求。

这是使用域的基本方法。

例如:

var d = domain.create();
d.on('error', function(er) {
  console.error('Caught error!', er);
});
d.run(function() {
  process.nextTick(function() {
    setTimeout(function() { // simulating some various async stuff
      fs.open('non-existent file', 'r', function(er, fd) {
        if (er) throw er;
        // proceed...
      });
    }, 100);
  });
});

这个例子里程序不会崩溃,而会触发d.on('error')

domain.members

  • {Array}

显式添加到域里的计时器和事件分发器数组。

domain.add(emitter)

  • emitter {EventEmitter | Timer} 添加到域里的计时器和事件分发器

显式地将一个分发器添加到域。如果分发器调用的事件处理函数抛出错误,或者分发器遇到error事件,将会导向域的error事件,和隐式绑定一样。

对于setIntervalsetTimeout返回的计时器同样适用。如果这些回调函数抛出错误,将会被域的'error'处理器捕捉到。

如果计时器或分发器已经绑定到域,那它将会从上一个域移除,绑定到当前域。

domain.remove(emitter)

  • emitter {EventEmitter | Timer} 要移除的分发器或计时器

与domain.add(emitter)函数恰恰相反,这个函数将分发器移除出域。

domain.bind(callback)

  • callback {Function} 回调函数
  • return: {Function}被绑定的函数

返回的函数是一个对于所提供的回调函数的包装函数。当调用这个返回的函数被时,所有被抛出的错误都会被导向到这个域的error事件。

Example

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.bind(function(er, data) {
    // if this throws, it will also be passed to the domain
    return cb(er, data ? JSON.parse(data) : null);
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});

domain.intercept(callback)

  • callback {Function} 回调函数
  • return: {Function} 被拦截的函数

domain.bind(callback)类似。除了捕捉被抛出的错误外,它还会拦截Error对象作为参数传递到这个函数。

这种方式下,常见的if (er) return callback(er);模式,能被一个地方一个错误处理替换。

Example

var d = domain.create();

function readSomeFile(filename, cb) {
  fs.readFile(filename, 'utf8', d.intercept(function(data) {
    // note, the first argument is never passed to the
    // callback since it is assumed to be the 'Error' argument
    // and thus intercepted by the domain.

    // if this throws, it will also be passed to the domain
    // so the error-handling logic can be moved to the 'error'
    // event on the domain instead of being repeated throughout
    // the program.
    return cb(null, JSON.parse(data));
  }));
}

d.on('error', function(er) {
  // an error occurred somewhere.
  // if we throw it now, it will crash the program
  // with the normal line number and stack message.
});

domain.enter()

这个函数就像runbindintercept的管道系统,它设置有效域。它设定了域的domain.activeprocess.domain,还隐式的将域推到域模块管理的域栈(关于域栈的细节详见domain.exit())。enter函数的调用,分隔了异步调用链以及绑定到一个域的I/O操作的结束或中断。

调用enter仅改变活动的域,而不改变域本身。在一个单独的域里可以调用任意多次Enterexit

domain.exit()

exit函数退出当前域,并从域的栈里移除。每当程序的执行流程要切换到不同的异步调用链的时候,要保证退出当前域。调用exit函数,分隔了异步调用链,和绑定到一个域的I/O操作的结束或中断。

如果有多个嵌套的域绑定到当前的上下文,exit函数将会退出所有嵌套。

调用exit仅改变活跃域,不会改变自身域。在一个单独的域里可以调用任意多次Enterexit

如果在这个域名下exit已经被设置,exit将不退出域返回。

domain.dispose()

稳定性: 0 - 抛弃。通过域里设置的错误事件来显示的消除失败的 IO 操作。

调用dispos后,通过run,bind或intercept绑定到域的回调函数不再使用这个域,并且分发dispose事件。

由JSRUN为你提供的JS在线运行、在线编译工具
        JSRUN提供的JS 在线运行,JS 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout