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
}

解题思路:

首先,我们需要找到R的位置,然后从该位置开始,依次向上、下、左、右四个方向遍历。我们可以定义一个变量count来记录出现p的有效次数。在遍历过程中,我们需要判断是否存在B,如果存在,就停止该方向的遍历。如果遇到有效的p,就将计数count加1,并停止该方向的遍历。最终,返回count的值,即为题目所求的次数。

Review

Deadly fire ants spreading across Australia

澳大利亚独特的生态系统正受到一种入侵和致命物种——红火蚁的威胁。这种微小的蚂蚁原产于南美洲,但在过去一个世纪里已经传播到世界各地。它是世界上最具入侵性的生物之一。它对农作物和农业用地造成了广泛的破坏。它还杀死了大量的本地昆虫和其他动物,包括牲畜。蚂蚁的剧痛和毒液叮咬会导致人类严重的过敏反应。它还可能导致致命的过敏性休克。农业部长的一位女发言人称火蚁是“一种可怕的入侵性超级害虫,会造成严重的社会、经济和环境危害”。

2001年,红火蚁首次在澳大利亚被发现。自那时以来,它们在很大程度上被限制在昆士兰州内。然而,澳大利亚入侵物种委员会(ISC)表示,这些蚂蚁正在洪水中传播到全国各地。它们成千上万地相互粘着,在暴风雨的洪水中形成“筏子”。ISC的一份声明称:“火蚁在降雨前后更加活跃,可以形成巨大的漂浮筏,随着水流移动,在新地区建立立足点。”它补充说:“我们的团队专注于限制进一步的传播。”ISC警告说,如果目前的爆发不得到控制,火蚁将到达“澳大利亚的每一个角落”。

Tip

Package.json中依赖库版本号前缀^和~的区别?

在了解^~区别之前,我们需要在语义化版本 2.0.0 | Semantic Versioning (semver.org)上了解项目版本号规范。根据语义化版本规范,一个版本号由三个数字组成,用点号分隔,格式为"主版本号.次版本号.补丁版本号",例如版本号2.5.6。以下是对每个数字的含义:

  1. 主版本号:当进行大规模的API变更或不兼容的改动时,增加主版本号。这意味着新版本可能会导致现有代码无法正常工作。
  2. 次版本号:当添加新功能,但保持向后兼容时,增加次版本号。新版本引入的改动应该可以与旧版本的代码兼容。
  3. 补丁版本号:当进行小的bug修复或性能优化等不影响现有功能的改动时,增加补丁版本号。补丁版本号的更新应该不会引入新的功能或破坏现有功能。

在package.json文件中,dependencies字段用于指定项目所依赖的包及其版本。在这些依赖项的版本号中:

  1. ^符号:允许安装指定版本的最新次要版本,但不包括更高的主要版本。例如,如果依赖项的版本号为^1.2.3,那么运行npm install命令时,将安装1.2.3版本的最新次要版本,例如1.2.4、1.3.0,但不会安装2.0.0版本。
  2. ~符号:允许安装指定版本的最新补丁版本,但不包括更高的次要版本。例如,如果依赖项的版本号为~1.2.3,那么运行npm install命令时,将安装1.2.3版本的最新补丁版本,例如1.2.4,但不会安装1.3.0版本。

总结起来,^符号允许安装指定版本的最新次要版本,而~符号允许安装指定版本的最新补丁版本。

Share

  1. 在给任何事情下结论之前,需要做下调研,依据事实和数据来判断,不能空口无凭。
  2. 发脾气不是你的目的,解决问题才是,不要让愤怒影响到自己的判断。
  3. 如果管人是那么简单的事情,那么管理也不会是一门复杂的学科,如果团队里的人都如此合你心意,什么工作都做得很好,那还要你干嘛,你不就是有和没有都是一样了么?容人所短,用其所长。