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);

浙公网安备 33010602011771号