ARTS Week 19

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,用于存储平滑后的图像。 ...

2024-03-02 · 2 分钟 · 271 字

ARTS Week 18

Algorithm 本周的算法题为 485. 最大连续 1 的个数 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 实现代码如下: const findMaxConsecutiveOnes = function (nums) { // 数组转换为字符串 const str = nums.join('') // 如果不存在0,则直接返回数组长度即可 if (str.indexOf('0') === -1) { return nums.length } // 如果不存在1,则直接返回0 if (str.indexOf('1') === -1) { return 0 } // 通过0切割为各字符串数组 const arr = nums.join('').split('0') // 通过比较字符长度,从长到短排序,然后获取索引为0,即可获取最大连续1的个数的值 const maxValue = arr.sort(function (a, b) { return b.length - a.length; })[0]; return maxValue.length }; 解题思路: 首先讲nums数组转换为字符串,然后通过0切割成不同长度全为1的字符串数组,本来一开始打算使用Math.max(…arr)实现的,但是因为Math.max()在执行时,会转换为数字进行比较,而且是number类型,在转换超长字符串111时,丢失精度,最大只能返回8,无法满足解题需求。所以,调整为使用sort来实现,当b.length - a.length时,按照字符串长度从长到短进行排序;当a.length - b.length时,按照字符串长度从短到长进行排序,然后通过索引0获取最大值maxValue,至此,maxValue.length即为所求值。 Review Cold weather exercise burns more calories 每个人都知道锻炼对保持健康是必不可少的。它可以降低患心脏病的风险,并帮助我们保持健康的体重。它还能减轻压力,让我们更快乐。医生说,在寒冷的天气里锻炼对我们更有好处。在寒冷或寒冷的天气里慢跑甚至游泳对我们的身心健康有额外的好处。原因是寒冷给我们的心脏一个更有活力的锻炼。纽约特殊外科医院的安吉拉·佩德约诺维奇医生解释了原因。她说:“在寒冷的天气里,你的心脏必须更加努力地将血液输送到全身。随着时间的推移,这有助于提高你的耐力。” 佩德约诺维奇博士说,寒冷天气的锻炼可以帮助身体以更快的速度燃烧卡路里。她说:“因为你的身体需要更努力地工作来保持核心温度,所以在寒冷的环境中锻炼实际上会增加卡路里的燃烧。”在低温下进行体育锻炼可以促进我们的新陈代谢,从而帮助我们减肥。在寒冷中,我们的新陈代谢减慢,所以我们可以保存脂肪和保暖。另一个好处是,在自然光下有助于减轻我们的压力。这对于患有季节性情感障碍(S.A.D.)的人来说尤其如此。这是一种由冬季白昼变短、变暗引起的抑郁症。这在远离赤道的人身上更为常见。 注:所以为什么说减肥最佳运动方式是游泳,一方面是上面的原因,另一方面是因为不伤膝盖,但是游完泳很容易饿,这点就很需要克制了,很多人就死在这点上哈哈哈。但是,我游了一两个月之后,发现游泳不一定就是最好的,因为水的阻力,相比慢跑,还是很难持续游起来的,没有强度心率没有达标,燃脂效率很低,效果就不够明显了。有一说一,蝶泳、自由泳这些真是难学,还是慢慢来吧。叔本华也说过保持身体健康的方式,里面就有“每日需运动两小时”和“经常洗冷水浴”。好长一段时间,因为嫌太麻烦了,冬天也是洗冷水澡的,但前提是水量要大,三下五除二就洗完了,不然真受不了。不过这些年都懈怠了,有时也觉得没必要刻意过得苦哈哈的,差不多就行了。不过,不要总是让自己身体和心态处于太安逸的环境,总归是对的。 Tip 为什么Math.max(...[ '', '','' ])的值为0? 这行代码使用扩展运算符将数组 ["", "", "", ""] 展开成参数列表,相当于 Math.max("", "", "", "")。由于 Math.max() 方法会将所有参数转换为数字再比较大小,空字符串会被转换为数字 0,因此最终比较的参数为 Math.max(0, 0, 0, 0)。 ...

2024-02-28 · 1 分钟 · 139 字

ARTS Week 17

Algorithm 本周的算法题为 989. 数组形式的整数加法 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。 给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。 示例 1: 输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234 实现代码如下: var addToArrayForm = function (num, k) { var numStr = '' var outStr = '' var outNum = [] for (let i = 0; i < num.length; i++) { numStr = numStr + num[i] } outStr = BigInt(numStr) + BigInt(k) + '' for (let i = 0; i < outStr.length; i++) { if (outStr[i] !== 'n') { outNum.push(Number(outStr[i])) } } return outNum } 解题思路: 首先,先将num数组转为数字,然后再和k相加,最后再次遍历为数组即可。在实现过程中遇到Number转换超长String会出现精度丢失问题,使用BigInt实现,但是因为BigInt格式后缀会有n,所以在转换为数组时,判断去掉n。 Review Decimal point 150 years older than thought 一项新发现令全球数学家兴奋不已。最近出土的文件显示,生活在威尼斯的商人乔瓦尼·比安奇尼(Giovanni Bianchini)在14世纪40年代的记录中使用了一个小数点。历史学家对这一重大发现给予了高度评价,因为它意味着小数点的使用比之前认为的要早150年。比安奇尼是一位敏锐的天文学家,他对自己观测到的天象进行了详细标注,并提供了基于恒星和行星排列计算占星术预测给威尼斯人民。格伦·范·布鲁梅伦博士注意到比安奇尼在1441年至1450年间一篇论文中使用了小数点。如今,小数点已成为我们生活中不可或缺的一部分,并且看起来已经被使用了几千年。历史学家指出,在20世纪90年代,伊斯兰世界就开始采用某种形式上等同于小数点功能的符号。很可能是由于比安奇尼曾去过中东并受到那里学者们影响所致,这些学者在许多数学概念形成方面扮演着关键角色。其他历史证据表明,在12世纪中国知识分子也采用过某种形式上等同于小数点功能的符号。直到1593年才有确切记录显示最早明确使用小数点系统,当时德国数学家克里斯托夫·克拉维斯在其天文研究中应用了该系统。 Tip 在windows环境使用git安装nvm 因公司电脑做了软件安装限制,导致不能使用.exe方式配置nvm工具,但是平时项目开发中,经常需对老项目使用不同的node版本,所以这个工具还是很重要的。确定研究一下有没有其他方式配置nvm,在github上看到有Git Install章节,用法是要git clone项目源码下来,然后配置,但是现在github一直clone不了项目,所以就去gitee上看了一下,发现有这个仓库nvm-cn: 🧊 nvm国内安装工具 (gitee.com),用法很简单,只需要在Git Bash Here上使用以下命令即可安装: ...

2024-02-26 · 1 分钟 · 147 字

ARTS Week 16

Algorithm 本周的算法题为 999. 可以被一步捕获的棋子数 在一个 8 x 8 的棋盘上,有一个白色的车(Rook),用字符 'R' 表示。棋盘上还可能存在空方块,白色的象(Bishop)以及黑色的卒(pawn),分别用字符 '.','B' 和 'p' 表示。不难看出,大写字符表示的是白棋,小写字符表示的是黑棋。 车按国际象棋中的规则移动。东,西,南,北四个基本方向任选其一,然后一直向选定的方向移动,直到满足下列四个条件之一: 棋手选择主动停下来。 棋子因到达棋盘的边缘而停下。 棋子移动到某一方格来捕获位于该方格上敌方(黑色)的卒,停在该方格内。 车不能进入/越过已经放有其他友方棋子(白色的象)的方格,停在友方棋子前。 你现在可以控制车移动一次,请你统计有多少敌方的卒处于你的捕获范围内(即,可以被一步捕获的棋子数)。 输入:[ [".",".",".",".",".",".",".","."], [".",".",".","p",".",".",".","."], [".",".",".","R",".",".",".","p"], [".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".","."], [".",".",".","p",".",".",".","."], [".",".",".",".",".",".",".","."], [".",".",".",".",".",".",".","."] ] 输出:3 解释:在本例中,车能够捕获所有的卒。 实现代码如下: var numRookCaptures = function (board) { var x = 0 var y = 0 // 定义标记outer,用于break中止外层for循环,结束获取R位置的流程。 outer: for (let i = 0; i < board.length; i++) { for (let j = 0; j < board[i].length; j++) { if (board[i][j] == 'R') { x = j y = i break outer } } } let count = 0 for (let i = x; i >= 0; i--) { if (board[y][i] === 'B') { break } if (board[y][i] === 'p') { count += 1 break } } for (let i = x; i < 8; i++) { if (board[y][i] === 'B') { break } if (board[y][i] === 'p') { count += 1 break } } for (let i = y; i >= 0; i--) { if (board[i][x] === 'B') { break } if (board[i][x] === 'p') { count += 1 break } } for (let i = y; i < 8; i++) { if (board[i][x] === 'B') { break } if (board[i][x] === 'p') { count += 1 break } } return count } 解题思路: ...

2024-02-02 · 2 分钟 · 238 字

ARTS Week 15

Algorithm 本周的算法题为 566. 重塑矩阵 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。 重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。 如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。 输入:mat = [[1,2],[3,4]], r = 1, c = 4 输出:[[1,2,3,4]] 实现代码如下: var matrixReshape = function (mat, r, c) { let allNums = [] for (let i = 0; i < mat.length; i++) { for (let j = 0; j < mat[i].length; j++) { allNums.push(mat[i][j]) } } if (allNums.length !== r * c) { return mat } let resultValue = [] while (allNums.length > 0) { resultValue.push(allNums.splice(0, c)) } return resultValue } 解题思路: 首先,我们可以定义一个空数组allNums来存储mat矩阵中的所有元素。然后,我们需要判断allNums的长度是否等于重塑后矩阵的行数r乘以列数c。如果不相等,说明无法进行重塑操作,直接返回原始矩阵mat。如果相等,我们可以定义一个空数组result来存储重塑后的矩阵。接下来,我们可以通过列数c的值,使用数组splice(startIndex, endIndex)方法对allNums进行截取,直到allNums的长度为0。在每次截取后,将截取的部分作为一行加入resultValue数组中。完成截取后,我们可以返回resultValue作为重塑后的矩阵。一开始没看完题目描述最后一句,导致解题出现偏差。本来很简单的题目,自己想复杂了。 Review World will see first trillionaire in next 10 years 一首著名的歌曲和一个问答节目问道:“谁想成为百万富翁?”几十年来,拥有一百万美元是超级富豪的目标。现在,目标变成了十亿美元。反贫困慈善机构乐施会刚刚发布了一份报告,称未来十年内世界将诞生第一个万亿富翁。一万亿是一个巨大的数字和难以置信的金额。它由1后面跟着12个0组成。一万亿等于一百万个一百万美元。该慈善机构表示,贫富差距正在扩大,并指出自新冠疫情爆发以来这种差距已经“被加速”。报告还说:“我们将在未来十年内产生一个万亿富翁,而要消除贫困,则需要200多年。” 乐施会在世界经济论坛的年度会议上谈到了不平等问题。作为例子,它表示自2020年以来全球最富有的五个人的财富增长了114% 。该慈善机构发言人说:“前五位亿万富翁们的财富增加了两倍。另一方面,近50亿人变得更穷。”特斯拉CEO埃隆·马斯克是地球上最富有的人。他个人身价接近2500亿美元。AP新闻社称:“如果某人真正达到那个万亿元里程碑,他或她将与油气资源丰厚的沙特阿拉伯具有相同价值。”乐施会表示现在世界正处于“分裂之初”,呼吁开启“公共行动新时代”以缩小财富差距。 注:作为快船队小卡球迷,不得不说,这两年快船老板鲍尔默确实赚麻了。 Tip 使用npm install package@latest 时,安装的是V1.6.0还是V1.6.1-beta ? ...

2024-01-22 · 1 分钟 · 140 字