javascript二维数组的面试题
PHP中文网
•
•
编程技术 •
阅读 2
本文主要和大家分享一个关于javascript二维数组的面试题,希望能帮助到大家。给定一个二维数组,实现一个功能函数 fn,向这个函数中传递这个二维数组的一个坐标,如果这个坐标的值为 ”1“,将返回和这个坐标所有相连的并且坐标值为1坐标。
例如,传递了 fn([3,4])得到的结果为:
[[3,4],[4,4],[5,4],[6,4],[7,4],[8,4],[8,5],[8,6]]
var arr =[ [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0],] ;
登录后复制
解答思路:宽度优先遍历即可。供参考,相连条件没给出且当做是横竖方向:
var arr =[ [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,1,0,0],[0,0,0,0,1,0,0,0,1,0,0],[0,0,0,0,1,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0],[0,0,0,0,1,1,1,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],] function fn ([x, y]) { if (arr[x][y] !== 1) return false const queue = [[x, y]] const memo = arr.map(row => new Array(row.length).fill(false)) const direction = [ [-1, 0], [1, 0], [0, -1], [0, 1], ] while(queue.length > 0) { const [x, y] = queue.pop() direction.forEach(([h, v]) => { const newX = x + h const newY = y + v if (arr[newX][newY] === 1 && !memo[newX][newY]) { memo[newX][newY] = true queue.push([newX, newY]) } }) } const result = [] for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { if(memo[i][j]) { result.push([i, j]) } } } return result}console.log(fn([3,4]))
登录后复制
借鉴前两位 对象+递归实现
function fn(point) { var memo = {}, result = [], direction = [[-1, 0],[1, 0],[0, -1],[0, 1]] function dg([x, y]) { result.push(memo[x + "," + y] = [x, y]); direction.forEach(([h, v]) => { const newX = x + h const newY = y + v if (arr[newX][newY] === 1 && !memo[newX + "," + newY]) { dg([newX, newY]); } }) } dg(point); return result;}
登录后复制由于queue只是临时存匹配结果的,还要出队列进行新一轮的匹配所以只要再用一个缓存队列存储过往匹配的成功数据即可,没有必要最后在进行遍历的必要。代码如下:
var arr =[
立即学习“Java免费学习笔记(深入)”;
[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0],] function fn ([x, y]) { if (arr[x][y] !== 1) return false const queue = [[x, y]] const result = [[x,y]] const memo = arr.map(row => new Array(row.length).fill(false)) const direction = [ [-1, 0], [1, 0], [0, -1], [0, 1], ] while(queue.length > 0) { const [x, y] = queue.pop() direction.forEach(([h, v]) => { const newX = x + h const newY = y + v if (arr[newX][newY] === 1 && !memo[newX][newY]) { memo[newX][newY] = true queue.push([newX, newY]) result.push([newX, newY]) } }) } return result}
登录后复制
相关推荐:
定义JavaScript二维数组采用定义数组的数组来实现_基础知识
JavaScript二维数组实现的省市联动菜单_javascript技巧
javascript二维数组转置实例_javascript技巧
以上就是javascript二维数组的面试题的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2787737.html