Algorithm

本周的算法题为 1493. 删掉一个元素以后全为 1 的最长子数组

给你一个二进制数组 nums ,你需要从中删掉一个元素。

请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。

如果不存在这样的子数组,请返回 0 。

示例 2

输入nums = [0,1,1,1,0,1,1,0,1]
输出5
解释删掉位置 4 的数字后[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 

实现代码如下:

const longestSubarray = function (nums) {
    // 检查数组是否全为1
    function isAllOnes(arr) {
        return arr.every(n => n === 1);
    }

    // 检查数组是否全为0
    function isAllZeros(arr) {
        return arr.every(n => n === 0);
    }

    // 处理数组,返回最长连续1的长度
    function processArray(arr) {
        const str = arr.join("");
        const segments = str.split('0');
        let maxLength = 0;
        for (let segment of segments) {
            if (segment.length > maxLength) {
                maxLength = segment.length;
            }
        }
        return maxLength;
    }

    if (isAllOnes(nums)) {
        return nums.length - 1;
    }

    if (isAllZeros(nums)) {
        return 0;
    }

    // 找出所有满足条件的0的位置
    const zeroIndices = [];
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] === 0 && (nums[i - 1] === 1 || nums[i + 1] === 1)) {
            zeroIndices.push(i);
        }
    }
    if (zeroIndices.length === 0) {
        return processArray(nums);
    }

    let maxResult = 0;
    zeroIndices.forEach(index => {
        const modifiedArray = JSON.parse(JSON.stringify(nums));
        modifiedArray[index] = 1;
        const currentMax = processArray(modifiedArray);
        if (currentMax > maxResult) {
            maxResult = currentMax;
        }
    });

    return maxResult - 1;
};

解题思路:

  1. 处理特殊情况,如全1或全0数组。
  2. 遍历数组,找到所有左右至少有一个1的0的位置
  3. 如果没有符合条件的0,则直接计算原数组的最长连续1的长度。
  4. 对于每个符合条件的0,替换为1,切割数组,找到最长长度。
  5. 比较所有替换后的最长长度,并减1。
  6. 最终返回最大值。

其实一开始,我是通过判断左右都为1的0才作为候选进行替换,但在实际操作中发现了一个问题:替换为1并切割后的长度并不比原生的长,导致所求结果出现偏差。具体来说,替换后的最长连续1的长度小于原生长度,最终返回了原生长度。而这个原生长度并没有经过0替换为1的操作,因此减1的修正逻辑是不必要的,导致结果一直错误。

Review

Pakistan and India agree to ceasefire - Breaking News English Lesson

巴基斯坦和印度宣布停火,但双方均声称对方违反协议。这两个拥核邻国在最近几周已濒临全面战争。此次冲突的导火索是4月22日在印度控制的克什米尔地区帕哈甘旅游胜地发生的袭击事件,造成26名平民死亡。印度指责巴基斯坦策划了此次袭击,但巴基斯坦坚决否认指控。袭击发生后,双方互相发动军事打击:印度向巴基斯坦旁遮普省的空军基地发射导弹,巴基斯坦则称其目标是印度的军事设施。这些行动加剧了局势升级为更危险地区冲突的风险。

尽管达成停火,但局势仍显脆弱。巴基斯坦外交部表示“仍致力于忠实地执行停火协议”。印度军方发言人则否认印方违反停火的指控,并警告称“若领土遭袭,印度将进行反击”,强调“印度军队已做好全面作战准备,随时捍卫国家”。美国总统特朗普宣布此次停火是在美国斡旋下达成的,美方“敦促双方寻求缓和局势的途径,并愿意协助启动建设性对话”。此外,中国外交部长王毅也表示愿为印巴停火发挥建设性作用,支持通过对话解决争端。

Tip

如何在 Mermaid 在线编辑器中实现长截图?

Mermaid 在线编辑器 上快速截图,虽然已经支持以 PNG 格式下载,但当流程图很长时,页面两边的间距过大,导致流程图内容展示过小。所以,可以使用 Google 浏览器的全屏截图功能。具体操作是:在流程图预览模式下,按下 F12,然后按下 Ctrl + Shift + P,输入 screenshot,选择 Capture full size screenshot,这样就可以实现长截图了。

不过,在 Mermaid 中文网 上,这个方法一直没成功。后来发现,可以先点击 Kroki 预览流程图,然后缩小窗口,再使用上述命令,这样就能成功截图了。

Share

AI 时代团队管理的变与不变-InfoQ

  1. 软件改不动体现于,为了修复一个问题却带来了三个新问题,或为了修复一个小问题却导致了大故障,最终让人失去改的勇气和信心。
  2. 职业发展是在职场中完成的,而自我发展是在关系中完成的,且关系越是紧密的场合就越能帮助个人更好地发展自我。
  3. 一个自我发展不足的人,是很难在工作与生活中做好倾听、与人共情、尊重和看见他人的,且这些人也没有意识到这方面不足。
  4. 人最大的问题是不认为自己有问题,最重的傲慢是以为自己才对,背后折射出的是个人自我发展的不成熟。
  5. 育儿之所以对于成年人的自我发展那么重要,是因为成年人需要在一个更干净和纯粹的关系中,照见自己的不足、发现自己的傲慢与无知,通过这些强烈的刺激而引发自我改变。
  6. 自我成长是一个系统性的终身话题,对管理者的要求尤为高。
  7. 未来淘汰你的不是 AI,而是掌握 AI 的人。
  8. 人的核心竞争力在于通过软件设计驾驭复杂度,以及通过工程能力来确保软件开发的效率和质量,这两大内容没有人的参与 AI 独自是搞不定的。不过,我们可以通过用好 AI 而让这两件事变得更容易。
  9. 管理理念得从“胡萝卜 + 大棒”转向人性化管理和自组织管理。
  10. 实施人性化管理的背后,考验的是管理者自身的自我发展水平,当管理者不具备看见人、尊重人的能力并具备良好的独立人格时,他就很难有人性化管理的意识与行动。
  11. 低效的团队会让人无一例外地发现,管理者是整个团队的最大瓶颈。
  12. 这些管理者普遍面临精力、心力和能力“三力”不足的现象,以至于没有办法通过授权、放权、机制等有效的手段将自主性还给员工,从而让员工获得更多锻炼而更好地成长。
  13. 无论管理者有多强的能力,当一个团队交到他手上后,他就得想方设法激发每位团队成员的主人翁意识和工作热情,当员工有自主性时才能长出自驱力,进一步通过个体间的协作而变成自组织团队。
  14. 一个自组织团队的管理者,才能让自己的精力和心力不枯竭,而能打造出这样的团队,也意味着他是名胜任的管理者,证明自己的能力的同时,对管理者这个身份才会有认同感,才能找到成为管理者的价值感。
  15. 当管理者的焦点变成关注团队和人在先时,管理手段就会慢慢离开本能的命令和控制型。这个转变,也是从管理者个人的“我想”变成了整个团队的“我们想”。
  16. 管理者一定要有的认知是,团队是自己的,授权和支持员工的成长,最终都会让自己从中享受到成果,自己和员工是共赢而非博弈关系。共赢思维一旦建立,才会花更多的精力去塑造良好的团队文化氛围,以氛围做土壤,让员工进一步长出“我想”、“我要”和“我能”。
  17. 技术管理是有方法可循的,是可以学习的,最重要的是管理者得像解决软件缺陷那样去对待技术管理问题。