题目描述

解题思路(序列化)
- 看到本题我首先想到的是两层嵌套循环,计算下标和与k的关系不就行了,果然不会那么简单,因为有的元素,虽然下标和符合条件,但是却不符合条件,原因是一个格子被访问到,周围必须得有其他被访问到的格子,以m = 15,n = 15 ,k = 2为例,虽然(10,10)的下标符合但是它不能被访问到。
- 这里采用队列 + 方向数组的方法来遍历所有符合条件的元素
- 本题还需要计算一个数位和,这里采用的是通过转换为字符串,再将字符串转化为数字的形式来进行计算
- 同时本题还要考虑边界条件
- 下面的注释很清晰,看懂了就理解了这道题目
序列化代码
var movingCount = function (m, n, k) {
function getSum(x, y) {
const temp1 = String(x).split('');
const temp2 = String(y).split('');
const sumArr = [...temp1, ...temp2];
const sums = sumArr.reduce((pre, cur) => pre + Number(cur), 0);
return sums;
}
const directionArr = [
[-1,0],
[1,0],
[0,-1],
[0,1]
];
let set = new Set(['0,0']);
const queue = [[0,0]];
while (queue.length !== 0) {
let [x,y] = queue.shift();
for (let i = 0; i < 4; i++) {
let offsetX = directionArr[i][0] + x;
let offsetY = directionArr[i][1] + y;
if (offsetX < 0 || offsetY < 0 || offsetX >= m || offsetY >= n || getSum(offsetX,offsetY) > k || set.has(`${offsetX},${offsetY}`)) {
continue;
}
set.add(`${offsetX},${offsetY}`);
queue.push([offsetX,offsetY]);
}
}
return set.size;
};
总结(本题给我们的启示思路)
- 启示一:学会使用方向数组,遍历一个元素的上下左右
- 启示二:学会使用队列 + 方向数组的方式
- 启示三:学会通过字符串和数字的转换来求数位和
- 启示四:集合初始化时添加字符串的方式,是通过数组来实现的