#青训营笔记创作活动# 问题描述
小F被神秘力量带入了一个魔幻世界,这里危机四伏。为了在异世界中生存,小F需要找到安全区。异世界可以被表示为一个大小为n x m的二维数组,每个格子的值代表该位置的危险程度。
小F的能力值为X,当某个格子的危险程度小于等于X时,这个格子是安全的。如果多个安全的格子相邻(上下左右连通),它们可以构成一个安全区。你需要帮助小F计算出一共有多少个安全区。
测试样例
样例1:
输入:n = 3, m = 3, X = 4, a = [[2, 3, 3], [3, 3, 3], [3, 3, 3]]
输出:1
样例2:
输入:n = 2, m = 2, X = 5, a = [[6, 6], [6, 4]]
输出:1
样例3:
输入:n = 3, m = 3, X = 3, a = [[1, 2, 2], [2, 3, 3], [3, 4, 5]]
输出:1
题解:
一个原二维数组,新建一个visited数组记录是否经过,直接全部遍历,遇到安全值小于能力值且没经过的点就进入while循环。while循环通过队列实现安全区域的搜寻,通过maxnum记录安全区域的个数。
#青训营笔记创作活动#
1月25日 Day12
阿里的一次面试经历
一个朋友分享的阿里四面的问题,“请设计一个不能操作DOM和调接口的环境”。
传统的思路实现起来并不好实现,比如直接修改 window.document 的值,让开发者无法获取 document,但这个值其实是不能修改的,而禁用调接口的方法不能禁用第三方库,因为第三方库太多了。
而这个问题用沙箱就可以完美解决,沙箱(Sandbox) 是一种安全机制,为运行中的程序提供隔离环境,通常用于执行未经测试或不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境,内部程序的执行不会影响到外部程序的运行
iframe 标签可以创造一个独立的浏览器原生级别的运行环境,这个环境由浏览器实现了与主环境的隔离,利用 iframe 来实现一个沙箱是目前最方便、简单、安全的方法,可以把 iframe.contentWindow 作为沙箱执行的全局 window 对象,沙箱中对window的所有操作,都没有影响到外层的window,实现了隔离的效果。
然后主要进行两部分的操作
1.设置 blacklist 黑名单,添加 document、XMLHttpRequest、fetch、WebSocket 来禁止开发者操作DOM和调接口
2.判断要访问的变量,是否在当前环境的 window 对象中,不在的直接报错,实现禁止通过三方库调接口
而对于一些其他的获取DOM操作,比如通过 window.document 来获取 document 对象,依然是可以操作 DOM 的,所以需要在黑名单中添加windows字段来解决,同时虽然把 window 加入了黑名单,但 window 上的方法,如 open、close 等,依然是可以正常获取使用的。
对于通过new Image()调接口的方式,就可以通过在黑名单中添加Image字段来解决。
如果有其他的bug,也可以尝试在黑名单添加对应的字段来禁止调用。
1月25日 Day12
阿里的一次面试经历
一个朋友分享的阿里四面的问题,“请设计一个不能操作DOM和调接口的环境”。
传统的思路实现起来并不好实现,比如直接修改 window.document 的值,让开发者无法获取 document,但这个值其实是不能修改的,而禁用调接口的方法不能禁用第三方库,因为第三方库太多了。
而这个问题用沙箱就可以完美解决,沙箱(Sandbox) 是一种安全机制,为运行中的程序提供隔离环境,通常用于执行未经测试或不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境,内部程序的执行不会影响到外部程序的运行
iframe 标签可以创造一个独立的浏览器原生级别的运行环境,这个环境由浏览器实现了与主环境的隔离,利用 iframe 来实现一个沙箱是目前最方便、简单、安全的方法,可以把 iframe.contentWindow 作为沙箱执行的全局 window 对象,沙箱中对window的所有操作,都没有影响到外层的window,实现了隔离的效果。
然后主要进行两部分的操作
1.设置 blacklist 黑名单,添加 document、XMLHttpRequest、fetch、WebSocket 来禁止开发者操作DOM和调接口
2.判断要访问的变量,是否在当前环境的 window 对象中,不在的直接报错,实现禁止通过三方库调接口
而对于一些其他的获取DOM操作,比如通过 window.document 来获取 document 对象,依然是可以操作 DOM 的,所以需要在黑名单中添加windows字段来解决,同时虽然把 window 加入了黑名单,但 window 上的方法,如 open、close 等,依然是可以正常获取使用的。
对于通过new Image()调接口的方式,就可以通过在黑名单中添加Image字段来解决。
如果有其他的bug,也可以尝试在黑名单添加对应的字段来禁止调用。
展开
评论
点赞