ARTS Week 20

Algorithm 本周的算法题为 1222. 可以攻击国王的皇后 在一个 下标从 0 开始 的 8 x 8 棋盘上,可能有多个黑皇后和一个白国王。 给你一个二维整数数组 queens,其中 queens[i] = [xQueeni, yQueeni] 表示第 i 个黑皇后在棋盘上的位置。还给你一个长度为 2 的整数数组 king,其中 king = [xKing, yKing] 表示白国王的位置。 返回 能够直接攻击国王的黑皇后的坐标。你可以以 任何顺序 返回答案。 示例 1: 输入:queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0] 输出:[[0,1],[1,0],[3,3]] 解释:上面的图示显示了三个可以直接攻击国王的皇后和三个不能攻击国王的皇后(用红色虚线标记)。 实现代码如下: var queensAttacktheKing = function(queens, king) { // 初始化棋盘 const board = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => null)); // 将皇后的位置标记在棋盘上 queens.forEach((queen) => { board[queen[0]][queen[1]] = 'Q'; }); const res = []; // 顺时针方向遍历棋盘 const directions = [ [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1] ]; for (const element of directions) { const [dx, dy] = element; let x = king[0] + dx; let y = king[1] + dy; while (x >= 0 && x < 8 && y >= 0 && y < 8) { if (board[x][y] === 'Q') { res.push([x, y]); break; } x += dx; y += dy; } } return res; }; 解题思路: ...

2024-03-09 · 2 分钟 · 214 字

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 字