找"最长连续相同字符"的长度,学员循环到 #s 时还去比较"下一个字符"——sub 越界返回空串,恰好不崩但循环多跑了一轮无效边界;也有人反复 sub 取字符,性能与正确性都成问题。错误场景:
local s = "aabbbcd"
for i = 1, #s do
if string.sub(s, i, i) == string.sub(s, i + 1, i + 1) then
-- i = #s 时右侧越界返回空串
end
end
边界多跑一轮虽不报错,但空串比较埋下逻辑隐患——边界意识要从第一课练起。
循环到 #s - 1,用 byte 直接比较相邻字节(ASCII 场景),一次扫描同时维护当前段与最长段。规范写法。示例代码如下:
local s = "aabbbcd"
local best, cur = 1, 1
for i = 1, #s - 1 do
if string.byte(s, i) == string.byte(s, i + 1) then
cur = cur + 1
if cur > best then
best = cur
end
else
cur = 1
end
end
print(best)
输出 3——"bbb" 是最长的连续相同段,byte 比较也比 sub 取串轻量。
三步验证:"aabbbcd" 跑出 3;全同串 "aaaa" 跑出 4;无重复串 "abcd" 跑出 1——三组边界确认扫描正确。
想定位最长段的起始位置,记录最优出现时的游标即可。示例代码如下:
local s = "aabbbcd"
local best, cur, pos = 1, 1, 1
for i = 2, #s do
if string.byte(s, i) == string.byte(s, i - 1) then
cur = cur + 1
else
cur = 1
end
if cur > best then
best, pos = cur, i - cur + 1
end
end
print(best, string.sub(s, pos, pos + best - 1))
输出 3 与 bbb——长度与位置一次扫描同时拿到,截图标注类功能直接复用。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 对比两份任务记录的"共同路线":要求连续的子串可以逐位比对,允许跳过中间步骤的最长公共子序列却没法直…
【游戏】 一、业务场景 新玩家出门就挨打,图文教学没人看,第二天流失率居高不下。训练营上线:三个分阶关卡(走位、连招、节奏)…
【语法】 一、隐蔽陷阱 五只猴子分桃,每来一只把桃分成 5 份多 1 个扔掉再拿走一份。正向从 1 个桃开始试,试到几千个才…
【游戏】 一、业务场景 满级玩家装备毕业后一周流失,进度条走到头没了盼头。渡劫玩法上线:80 级可挑战三重天劫,全通获得渡劫…
【语法】 一、隐蔽陷阱 63 分找零用面额 1、5、10、25 的硬币,贪心取最大面额 6 枚搞定;可换成面额 1、3、4 …
【游戏】 一、业务场景 会长每天手动发福利、清名单、盯报名,帮务占满游戏时间,连着三周漏发福利被帮众催。帮会管家上线:每周 …