Algorithm
本周的算法题为 661. 图片平滑器
图像平滑器 是大小为 3 x 3
的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。
给你一个表示图像灰度的 m x n
整数矩阵 img
,返回对图像的每个单元格平滑处理后的图像 。
示例 1:
输入:img = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[0, 0, 0],[0, 0, 0], [0, 0, 0]]
解释:
对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
实现代码如下:
var imageSmoother = function (img) {
const m = img.length;
const n = img[0].length;
const result = new Array(m).fill(0).map(() => new Array(n).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
result[i][j] = calculate(i, j);
}
}
return result;
function calculate(i, j) {
let totalValue = 0;
let count = 0;
for (let x = Math.max(0, i - 1); x <= Math.min(i + 1, m - 1); x++) {
for (let y = Math.max(0, j - 1); y <= Math.min(j + 1, n - 1); y++) {
totalValue += img[x][y];
count++;
}
}
return totalValue / count >> 0;
}
}
解题思路:
首先,代码初始化了两个变量 m
和 n
,分别表示输入二维数组 img
的行数和列数。然后,创建了一个与 img
相同大小的二维数组 result
,用于存储平滑后的图像。
接下来,使用两个嵌套的循环遍历 img
中的每个像素,通过调用内部函数 calculate
计算对应位置的平均值,并将结果存储到 result
数组中。
calculate
函数用于计算给定位置 (i, j)
像素及其周围像素的平均值。它首先定义了两个变量 totalValue
和 count
,分别用于记录像素值的总和和像素数量。
然后,使用两个嵌套的循环遍历 (i, j)
周围的像素。通过调用 Math.max
和 Math.min
函数来确保不越界,遍历的范围是 (i-1, j-1)
到 (i+1, j+1)
。在每次遍历中,将遍历到的像素值累加到 totalValue
中,并增加 count
的值。
最后,返回 totalValue / count
的整数部分,使用位右移运算符 >> 0
实现。这样就得到了 (i, j)
像素及其周围像素的平均值。
整个过程在外部循环中进行,完成后返回平滑后的图像 result
。
Review
Airline starts to weigh luggage AND passengers - Breaking News English Lesson
芬兰国家航空公司芬兰航空已经开始在从首都赫尔辛基出发的航班上对乘客进行称重。这次称重是基于自愿的原则,并且完全匿名。公司发言人表示,这项新举措是为了确保航班安全标准得到遵守。他说,任何一架飞机都不应超过安全起降的最大重量限制。这个重量包括飞机本身、燃料、托运行李和货物、机上餐饮品、水箱和乘客的重量。芬兰航空表示,航空公司无法准确知道乘客和他们的随身行李的具体重量,因此他们必须依赖航空当局提供的平均估计值。
自愿参加称重的乘客将在赫尔辛基机场的登机口站上称重秤。芬兰航空官员最初担心客户会强烈反对,因为体重是一个非常私人的问题。然而,在测试的第一个星期,超过1000名乘客同意接受称重。公司表示:“我们希望能够有足够多的志愿者,包括商务和休闲旅行者,以便我们可以获得尽可能准确的信息来进行重要的平衡计算。”它补充说:“目前为止,我们的客户对此反应非常积极。”一位官员表示,旅客可以“放心”,他们的体重不会与个人数据关联起来,可以“安心”。
Tip
超长String
转Number
精度丢失问题
在实现算法题时,遇到最后数字相加的值和预期的值不一致,因为使用的Number(str)
方法,有一定的区间限制,会出现精度丢失。修改为使用BigInt
实现,可以表示任意大的整数,但是BigInt
在表示时,后缀会有一个n
,这样的话就没办法直接和Number
类型的数字进行运算,只能Number
转为BigInt
来运算,拿到结果之后再进行下一步处理。
Share
OpenAI也搞“年龄歧视”?奥特曼对话盖茨爆料:员工整体年龄偏大,是个坏兆头-InfoQ精选文章
山姆·奥特曼: 大家一定经常让你提点建议,那你一般会怎么说?
比尔·盖茨: 我觉得这世界上有很多不同形式的人才。在我的职业生涯之初,我只重视纯粹的智商,类似于工程技术的灵性。当然,这个逻辑在财务和销售领域也有体现。但事实证明这是不对的。能建立起强大团队的技能组合才是重中之重。能引导人们思考、找到想要解决的问题、建立一支融合不同人才的队伍,才是最重要的能力所在。所以我想告诉年轻人,数学和科学能力当然很重要,但如果你真想成就一番事业,那么前面说的这种才能组合必不可少。
你呢,你会给出什么样的建议?
山姆·奥特曼: 我比较关注大多数人对于风险的错误理解。大家往往害怕放弃自己当前这份轻松愉快的工作,不敢奔赴自己真正想做的事情。但实际上,如果始终止步不前,那他们最终回顾一生,只会感叹自己从没有投入过、没有创办自己想象中的企业、也没试着成为一名 AI 研究者。我觉得这才是最大的风险,是让整个人生沦于平庸的风险。
正因为如此,我们应该明确自己的目标,同时积极询问其他人需要什么,这就是良好的开端。很多人都在以自己不想的方式虚耗时间,而我给出的建议就是试着以积极的方式解决这个问题。
比尔·盖茨: 确实,让人们从事一份自己有成就感、满足感的工作,往往能够迸发出他们自己都难以想象的力量。
山姆·奥特曼: 绝对是这样。