Skip to content
On This Page

手写题[算法题]

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或安全漏洞。

在比较版本号时,我们按照如下规则进行比较:

  1. 首先比较主版本号,主版本号较大的版本被认为是更新的版本。
  2. 如果主版本号相同,则比较次版本号,次版本号较大的版本被认为是更新的版本。
  3. 如果主版本号和次版本号都相同,则比较修订版本号,修订版本号较大的版本被认为是更新的版本。

通过这种方式,我们可以确定哪个版本号是较新的,或者两个版本号是否相同。

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