手写算法: 机器人能否返回原点

657. 机器人能否返回原点open in new window

解法一:计算机器人移动的距离

  1. 理解题意:原点为(0, 0)。机器人移动的方向为上下左右,每次移动的距离都是相同的。

  2. 那么可以把上下左右都分别看作U: y = y + 1D: y = y - 1R: x = x + 1L: x = x - 1

  3. 移动完后,再看 x 和 y 的值是否为 0,是的话那么就回到了原点

/**
 * @param {string} moves
 * @return {boolean}
 */
var judgeCircle = function(moves) {
  let x = 0,
    y = 0;

  for (let i = 0; i < moves.length; i++) {
    const char = moves[i];
    if (char === 'U') {
      y++;
    } else if (char === 'D') {
      y--;
    } else if (char === 'R') {
      x++;
    } else if (char === 'L') {
      x--;
    }
  }
  return x === 0 && y === 0;
};

解法二:判断上下移动的次数和左右移动的次数是否相等

/**
 * @param {string} moves
 * @return {boolean}
 */
var judgeCircle = function(moves) {
  return (
    moves.split('U').length === moves.split('D').length &&
    moves.split('L').length === moves.split('R').length
  );
};

手写题: 实现深拷贝

63. create _.cloneDeep()open in new window

这里考虑到拷贝对象时,key 是 Symbol 的情况, 如cloneDeep({[Symbol()]:'bfe'})

function cloneDeep(target, map = new Map()) {
  if (target === null || typeof target !== 'object') return target;
  if (map.has(target)) return map.get(target);

  const cloneTarget = Array.isArray(target) ? [] : {};
  map.set(target, cloneTarget);

  // 拿键名是Symbol的,与正常的key拼接
  const keys = [
    ...Object.getOwnPropertySymbols(target),
    ...Object.keys(target),
  ];

  for (const key of keys) {
    cloneTarget[key] = cloneDeep(target[key], map);
  }
  return cloneTarget;
}
Last Updated:
Contributors: kk