Algorithm

本周的算法题为 1156. 单字符重复子串的最大长度

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。

给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

示例 1
输入text = "ababa"
输出3

实现代码如下:

const maxRepOpt1 = function (text) {
    const count = {};
    for (const char of text) {
        if (!count[char]) {
            count[char] = 0;
        }
        count[char]++;
    }

    let max_length = 0;
    const n = text.length;

    for (let i = 0; i < n; i++) {
        const char = text[i];
        let length = 1; 
        let j = i + 1;
        while (j < n && text[j] === char) {
            length++;
            j++;
        }
        if (length < count[char]) {
            if (j < n && text[j] !== char && j + 1 < n && text[j + 1] === char) {
                let k = j + 1;
                while (k < n && text[k] === char) {
                    length++;
                    k++;
                }
                if (length < count[char]) {
                    length++;
                }
            } else {
                length++;
            }
        }
        max_length = Math.max(max_length, length);
    }
    return max_length;
}

解题思路:

  1. 使用一个对象 count 来统计每个字符的出现次数。遍历字符串,将每个字符的出现次数记录在 count 中。
  2. 使用一个外层循环,从每个字符开始,向右扩展,找到当前字符的最长连续重复子串。
  3. 如果当前子串长度小于该字符的总出现次数,尝试检查子串两端是否有相同字符,或者中间是否有不同字符可以交换。
  4. 每次找到一个更长的子串时,更新 max_length

Review

Lunar New Year sees record migration in China - Breaking News English Lesson

春节是中国最重要的节日。数亿人会返回家乡庆祝这一传统佳节,今年也不例外。机场、火车站和汽车站挤满了踏上年度返乡之旅的旅客。今年对应中国十二生肖中的蛇年。庆祝活动从1月29日开始,持续长达16天,其中前七天是国家法定假日。路透社报道称今年出境游尤其受欢迎,援引某旅行社数据称"平台出境航班和度假套餐预订量较去年翻倍",最热门目的地集中在亚洲地区。

美联社将中国春节称为"全球最大规模的年度人口迁徙"。随着中国现代化高速交通网络的发展,春运流动人数呈几何级增长。新华社预计今年出行人次将"创历史新高"。3500年前春节雏形初现时,离乡者寥寥无几。但随着中国经济腾飞,数十亿人因工作、求学或追求更好的生活在全国各地迁徙。这场年度迁徙潮成为经济助推器,旅游、酒店和零售行业在此期间迎来利润增长。

Tip

通过TeamViewer传输exe文件过大的问题

使用Electron开发的一个PC软件,包大小为400MB,有可能是TeamViewer传输大小有限制,每次传到200MB就自动中断了,导致无法把.exe文件从A电脑传输到无网络的B电脑上,又不想使用U盘进行传输,因为B电脑主机环境在机房,操作起来非常不方便。为了解决这个问题,可以通过压缩分卷的方式,把400MB大小的软件包分成两个200MB即可。以VSCode软件为例,将100MB软件包压缩分卷为两个50MB的文件。

Share

《2025 年,我的第一个建议是别当程序员了!但如果非要当,这些办法可以教会你如何提升自己》

  1. 我在做事时,倾向于不轻易说“给你 10 个人去做”。因为一旦给团队说 10 个人去做,团队就不思考了。

  2. 优秀的程序员通过自己的思考,产生的影响是非线性的,一定要用好这种能力。

  3. 很多创新都是在资源受限的情况下被迫发生的。

  4. 我是个实用主义者,我所学的所有技术都是因为别人付钱让我去做项目。我从不免费学习知识或做项目。所以,我的判断完全不是从美感或品位出发的,在我看来,品位就是用最低的成本赚最多的钱。如果一个设计不能让我后续用最低成本维护、用最少时间达到效果并赚到钱,那它就不是好设计。

  5. 如果只注重表面的美观而忽视了实用性,那么这种所谓的“美”只是主观的,并不符合业界的实际需求和标准。

  6. 我认为所谓品味,你应该问自己:解决这个问题该用什么方法最优雅?这包括几方面考虑:一是你面临的脑力负担,需不需要了解全貌才能解决;二是你要承担多大风险,作为工程师,首先要考虑的是项目会不会因你的选择而失败;三是收益。

  7. 我自己在做重大决定时,第一个倾向是能不做就不做,能晚点做就晚点做,保持系统的简洁,也就是所谓的品味。作为古典程序员流派,我更倾向于以简单为美。

  8. 程序员并没有绝对的优秀与否之分,评价标准并非线性。写代码比我快一秒钟,或者接口设计比我好一点点,都不能简单判定谁更出色。不存在这样一个明确的标准,每个人都可以从他人身上学到东西。如果真有值得学习之处,交流其实更为重要,而不是纠结于谁更优秀。这涉及到自我认知的问题,我建议就是放弃所有这种自我优越感,每个人都能从对方身上学到东西。

  9. 我觉得程序员这个职业和传统职业最大的不同在于,我们不需要做前人做过的工作。一个人把别人做过的事再做一遍,这没什么了不起,甚至在这个行业是可耻的。看看世界上需要什么,有什么问题需要解决,把问题解决好,你就厉害了。你不需要和任何人比较,你就是最厉害的。

  10. 不喜欢一定是有原因的,要么违反你的人性,要么违反你的道德。不做自己不感兴趣的事本身就是一个加分项,你会更有意愿去钻研,不会觉得累。比如我过去三四年,每天工作十四五个小时很常见,虽然赚钱也不多,但核心是开心,因为做了自己感兴趣的事,就不会觉得累。

  11. 抬杠的过程有助于去魅,并且强迫自己找证据、了解真相。敢于抬杠是一个挑战权威的过程,并且强迫自己学习。年轻人要想办法做和别人不一样的那个人,无论是做人还是做事。别人都做得那么好了,你还有什么希望?你要做点自己感兴趣,觉得还没人好好做的事。

  12. 如果不会英语,那就去学。现在全球化是大趋势,英语不仅是语言,更是一种思维方式,尤其是技术领域,它已经成为了全球交流的通用语言。如果你想进步,就必须克服语言障碍,融入全球化的交流中。中国年轻开发者确实需要提升眼界。有一个简单的方法就是多看像 Hacker News 这样的国际知名技术社区,并积极参与其中的讨论。

  13. 只要有效就 OK,关键是无效。所以,无效才是原罪。

  14. 对我们所有创业者来说,创业者首先是个产品经理,产品到底给谁用,为什么用户要用,这才是关键。