返回

JS下的剑指Offer(一):称霸题海,初窥门径

前端

剑指Offer(一):算法与编程的试金石

剑指Offer作为程序员面试中的经典考题集,以其涵盖面广、难度适中而备受推崇。本次我们将聚焦于剑指Offer中的JS实现,通过两个经典题目——JZ1和JZ2——探寻算法与编程的奥秘。

JZ1:二维数组的查找

题目

在一个二维数组中,每一行都按照从小到大的顺序排列,每一列也按照从小到大的顺序排列。请判断给定的目标值是否存在于该二维数组中。

算法分析

JZ1题目考验了数组遍历与二分查找的思想。我们可以采用分治法,从数组的左上角开始搜索,不断缩小搜索范围。如果目标值位于当前子数组中,则进一步缩小搜索范围;否则,跳过该子数组。

JS实现

const findNumberIn2DArray = (matrix, target) => {
  if (!matrix || matrix.length === 0) {
    return false;
  }
  let row = 0;
  let col = matrix[0].length - 1;
  while (row < matrix.length && col >= 0) {
    if (matrix[row][col] === target) {
      return true;
    } else if (matrix[row][col] < target) {
      row++;
    } else {
      col--;
    }
  }
  return false;
};

JZ2:替换空格

题目

请将一个字符串中的每个空格替换成"%20"。

算法分析

JZ2题目考察了字符串处理能力。我们可以采用逐字符遍历的方式,当遇到空格时,用"%20"替换。需要注意的是,字符串替换操作可能会改变字符串长度,因此需要额外空间来存储替换后的字符串。

JS实现

const replaceSpace = (s) => {
  if (!s || s.length === 0) {
    return "";
  }
  let newStr = "";
  for (let i = 0; i < s.length; i++) {
    if (s[i] === " ") {
      newStr += "%20";
    } else {
      newStr += s[i];
    }
  }
  return newStr;
};

总结

通过剖析剑指Offer中的JZ1和JZ2题目,我们不仅掌握了算法与编程的解题思路,也为面试和技术进阶奠定了基础。剑指Offer的征途仍在继续,让我们继续探索,在算法与编程的海洋中乘风破浪!