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;
}
解题思路:
- 使用一个对象
count
来统计每个字符的出现次数。遍历字符串,将每个字符的出现次数记录在count
中。 - 使用一个外层循环,从每个字符开始,向右扩展,找到当前字符的最长连续重复子串。
- 如果当前子串长度小于该字符的总出现次数,尝试检查子串两端是否有相同字符,或者中间是否有不同字符可以交换。
- 每次找到一个更长的子串时,更新
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 年,我的第一个建议是别当程序员了!但如果非要当,这些办法可以教会你如何提升自己》
我在做事时,倾向于不轻易说“给你 10 个人去做”。因为一旦给团队说 10 个人去做,团队就不思考了。
优秀的程序员通过自己的思考,产生的影响是非线性的,一定要用好这种能力。
很多创新都是在资源受限的情况下被迫发生的。
我是个实用主义者,我所学的所有技术都是因为别人付钱让我去做项目。我从不免费学习知识或做项目。所以,我的判断完全不是从美感或品位出发的,在我看来,品位就是用最低的成本赚最多的钱。如果一个设计不能让我后续用最低成本维护、用最少时间达到效果并赚到钱,那它就不是好设计。
如果只注重表面的美观而忽视了实用性,那么这种所谓的“美”只是主观的,并不符合业界的实际需求和标准。
我认为所谓品味,你应该问自己:解决这个问题该用什么方法最优雅?这包括几方面考虑:一是你面临的脑力负担,需不需要了解全貌才能解决;二是你要承担多大风险,作为工程师,首先要考虑的是项目会不会因你的选择而失败;三是收益。
我自己在做重大决定时,第一个倾向是能不做就不做,能晚点做就晚点做,保持系统的简洁,也就是所谓的品味。作为古典程序员流派,我更倾向于以简单为美。
程序员并没有绝对的优秀与否之分,评价标准并非线性。写代码比我快一秒钟,或者接口设计比我好一点点,都不能简单判定谁更出色。不存在这样一个明确的标准,每个人都可以从他人身上学到东西。如果真有值得学习之处,交流其实更为重要,而不是纠结于谁更优秀。这涉及到自我认知的问题,我建议就是放弃所有这种自我优越感,每个人都能从对方身上学到东西。
我觉得程序员这个职业和传统职业最大的不同在于,我们不需要做前人做过的工作。一个人把别人做过的事再做一遍,这没什么了不起,甚至在这个行业是可耻的。看看世界上需要什么,有什么问题需要解决,把问题解决好,你就厉害了。你不需要和任何人比较,你就是最厉害的。
不喜欢一定是有原因的,要么违反你的人性,要么违反你的道德。不做自己不感兴趣的事本身就是一个加分项,你会更有意愿去钻研,不会觉得累。比如我过去三四年,每天工作十四五个小时很常见,虽然赚钱也不多,但核心是开心,因为做了自己感兴趣的事,就不会觉得累。
抬杠的过程有助于去魅,并且强迫自己找证据、了解真相。敢于抬杠是一个挑战权威的过程,并且强迫自己学习。年轻人要想办法做和别人不一样的那个人,无论是做人还是做事。别人都做得那么好了,你还有什么希望?你要做点自己感兴趣,觉得还没人好好做的事。
如果不会英语,那就去学。现在全球化是大趋势,英语不仅是语言,更是一种思维方式,尤其是技术领域,它已经成为了全球交流的通用语言。如果你想进步,就必须克服语言障碍,融入全球化的交流中。中国年轻开发者确实需要提升眼界。有一个简单的方法就是多看像 Hacker News 这样的国际知名技术社区,并积极参与其中的讨论。
只要有效就 OK,关键是无效。所以,无效才是原罪。
对我们所有创业者来说,创业者首先是个产品经理,产品到底给谁用,为什么用户要用,这才是关键。