手写算法: 机器人能否返回原点
解法一:计算机器人移动的距离
理解题意:原点为(0, 0)。机器人移动的方向为上下左右,每次移动的距离都是相同的。
那么可以把上下左右都分别看作
U: y = y + 1、D: y = y - 1、R: x = x + 1、L: x = x - 1移动完后,再看 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
);
};
手写题: 实现深拷贝
这里考虑到拷贝对象时,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;
}