手写题[算法题]
1. 链式调用
题目:提供了一个数组结构的 data,要求实现一个 query
方法,返回一个新的数组,query 方法内部有 过滤
、排序
、分组
等操作,并且支持链式调用,调用最终的 execute
方法返回结果。
2. 三数之和
三数之和(3Sum)是一个经典的算法问题,要求在给定数组中找到所有不重复的三元组,使得三个数的和为0。
下面是一个 JavaScript 的实现示例:
javascript
function threeSum(nums) {
let result = [];
nums.sort((a, b) => a - b); // 先对数组进行排序
for (let i = 0; i < nums.length - 2; i++) {
if (i === 0 || (i > 0 && nums[i] !== nums[i - 1])) {
let left = i + 1;
let right = nums.length - 1;
let target = 0 - nums[i];
while (left < right) {
if (nums[left] + nums[right] === target) {
result.push([nums[i], nums[left], nums[right]]);
while (left < right && nums[left] === nums[left + 1]) left++;
while (left < right && nums[right] === nums[right - 1]) right--;
left++;
right--;
} else if (nums[left] + nums[right] < target) {
left++;
} else {
right--;
}
}
}
}
return result;
}
// 示例
const nums = [-1, 0, 1, 2, -1, -4];
console.log(threeSum(nums));
在这个实现中,我们首先对数组进行排序,然后使用双指针的方法来寻找三数之和为0的三元组。遍历数组,对于每一个数字,设定一个目标值,然后在剩余的部分使用双指针来找到满足条件的组合。
这样的实现能够在 O(n^2) 的时间复杂度内解决这个问题。
3. 有效括号匹配
有效括号匹配是指一个字符串中的括号是否能够完全匹配,即每个左括号都有相应的右括号与之匹配,并且括号之间的嵌套关系必须正确。
一种常见的解决方案是使用栈来实现。遍历字符串中的每个字符,当遇到左括号时,将其压入栈中;当遇到右括号时,检查栈顶元素是否为对应的左括号,如果是,则将栈顶元素弹出,继续遍历;如果不是,则说明括号不匹配,返回 false。最后,如果栈为空,则说明所有括号都匹配,返回 true;否则返回 false。
下面是一个 JavaScript 的实现示例:
javascript
function isValid(s) {
const stack = [];
const mapping = {
')': '(',
']': '[',
'}': '{'
};
for (let char of s) {
if (char in mapping) {
const topElement = stack.pop() || '#';
if (mapping[char] !== topElement) {
return false;
}
} else {
stack.push(char);
}
}
return stack.length === 0;
}
// 示例
console.log(isValid("()")); // true
console.log(isValid("()[]{}")); // true
console.log(isValid("(]")); // false
console.log(isValid("([)]")); // false
console.log(isValid("{[]}")); // true
4. 比较版本号
当我们谈论比较版本号时,通常是指在软件开发中对软件版本进行比较。软件版本号是用来标识软件发布的不同版本的一种方式,通常采用数字和点号(.)组合而成的字符串表示。
一般来说,版本号的格式遵循主版本号.次版本号.修订版本号的形式,例如:1.2.3。
- 主版本号:一般表示软件的重大更新或功能的重大改变,通常当软件有重大功能新增或变化时会增加主版本号。
- 次版本号:表示软件的较小更新,可能包含了一些新的功能、改进或修复了一些bug。
- 修订版本号:表示软件的修复版本,通常用于修复已知的bug或安全漏洞。
在比较版本号时,我们按照如下规则进行比较:
- 首先比较主版本号,主版本号较大的版本被认为是更新的版本。
- 如果主版本号相同,则比较次版本号,次版本号较大的版本被认为是更新的版本。
- 如果主版本号和次版本号都相同,则比较修订版本号,修订版本号较大的版本被认为是更新的版本。
通过这种方式,我们可以确定哪个版本号是较新的,或者两个版本号是否相同。
javascript
// 如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1,除此之外返回 0
function compareVersions(version1, version2) {
const v1 = version1.split('.');
const v2 = version2.split('.');
// 比较两个数组的长度,得到最大的数组长度
const maxLength = Math.max(v1.length, v2.length);
// 遍历数组,分别比较同一个位置上的版本号
for (let i = 0; i < maxLength; i++) {
// 忽略前导0,使用 parseInt() 转为数字
const num1 = parseInt(v1[i] || 0);
const num2 = parseInt(v2[i] || 0);
if (num1 > num2) {
return 1;
} else if (num1 < num2) {
return -1;
}
}
return 0;
};
// 示例
const version1 = "1.2.3";
const version2 = "1.2.4";
console.log(compareVersions(version1, version2)); // 输出: -1