2024/03/04 每日3题

问题1: 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为 n 的冷却时间。
返回完成所有任务所需要的 最短时间间隔 。

复制代码
function leastInterval(tasks, n) {
  // 统计每种任务出现的次数
  const count = new Array(26).fill(0);
  for (let task of tasks) {
    count[task.charCodeAt(0) - 'A'.charCodeAt(0)]++;
  }
  
  // 找出出现次数最多的任务的出现次数
  const maxCount = Math.max(...count);
  
  // 计算至少需要的时间间隔
  let leastTime = (maxCount - 1) * (n + 1) + maxCount;
  
  // 找出出现次数与最大出现次数相同的任务种类数
  let k = 0;
  for (let c of count) {
    if (c === maxCount) {
      k++;
    }
  }
  
  // 返回最终结果
  return Math.max(leastTime, tasks.length);
}

// 测试
const tasks = ["A", "A", "A", "B", "B", "B"];
const n = 2;
console.log(leastInterval(tasks, n)); // 输出: 8
复制代码

问题2 : 封装 JavaScript源文件的全部内容到一个函数块有什么意义?

这是一个越来越普遍的做法,已被许多流行的 JavaScript库( jQuery、 Node. js等)采用。这种技术创建了一个围绕文件全部内容的闭包。最重要的是,创建了一个私有的命名空间,有助于避免不同 JavaScript模块和库之间的命名冲突。
这种技术的另一个特点是,允许把一个易于引用的(更短的)别名用于全局变
量。例如, jQuery插件中, jQuery允许你使用 jQuery. no Conflict(),来禁止$引用到jQuery命名空间。在完成这项工作之后,利用这种闭包技术,代码仍然可以使用$,如下所示。
(function(s){/* jQuery plugin code referencing s */} )(jQuery)

将 JavaScript 源文件的全部内容封装到一个函数块中,通常被称为立即执行函数表达式(Immediately Invoked Function Expression,IIFE)。这种做法有一些意义和用途
1. 避免全局命名冲突: 将代码封装在函数块中可以避免污染全局命名空间,因为在函数内声明的变量和函数只在函数内部可见,不会影响全局作用域。

2. 模块化: 通过使用 IIFE,可以将代码模块化,使得模块内部的变量和函数对于外部来说是私有的,不会被外部访问或修改。

3. 作用域隔离: IIFE 可以为代码创建一个独立的作用域,避免外部代码对内部代码的影响,同时也可以保护内部的变量不被外部访问。

4. 闭包: 通过在 IIFE 内部定义变量和函数,并返回一个闭包,可以在外部作用域中访问和操作内部作用域的变量和函数。

5. 执行时机控制: 通过 IIFE,可以控制代码在何时执行,比如在文档加
(function() {
// 这里的变量和函数只在函数内部可见
var privateVar = "I'm private";
 
function privateFunction() {
return "I'm a private function";
}
 
// 返回一个闭包,使得内部的变量和函数可以在外部访问
window.publicFunction = function() {
return privateVar + " and " + privateFunction();
};
})();

问题3:精简对象
现给定一个对象或数组 obj,返回一个 精简对象 。精简对象 与原始对象相同,只是将包含 假 值的键移除。该操作适用于对象及其嵌套对象。数组被视为索引作为键的对象。当 Boolean(value) 返回 false 时,值被视为 假 值。
你可以假设 obj 是 JSON.parse 的输出结果。换句话说,它是有效的 JSON。

示例:
输入:obj = [null, 0, false, 1]
输出:[1]
解释:数组中的所有假值已被移除。

复制代码
function simplifyObject(obj) {
  if (Array.isArray(obj)) {
    return obj.map((item) => (item && typeof item === 'object') ? simplifyObject(item) : item).filter(Boolean);
  } else if (typeof obj === 'object' && obj !== null) {
    return Object.keys(obj).reduce((acc, key) => {
      const value = obj[key];
      if (value && typeof value === 'object') {
        const newValue = simplifyObject(value);
        if (newValue !== undefined) {
          acc[key] = newValue;
        }
      } else if (Boolean(value)) {
        acc[key] = value;
      }
      return acc;
    }, {});
  } else {
    return obj;
  }
}

// 测试
const input = {
  "a": 0,
  "b": false,
  "c": {
    "d": 1,
    "e": 0,
    "f": null,
    "g": {
      "h": "hello",
      "i": undefined,
      "j": ""
    }
  },
  "k": [1, false, 0, null, "test", {}]
};

const output = simplifyObject(input);
console.log(output);
复制代码

 

posted @   君临天下之徐少  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示