【语法】
一、隐蔽陷阱
把数组里所有的零移到末尾,非零元素保持原有顺序:新建一个表往里塞再补零,空间多一倍不说,顺序还得靠双下标小心维护。
二、底层原理
双指针原地操作:慢指针指向下一个非零元素应放的位置,快指针扫全表。遇到非零就与慢指针位置交换并推进慢指针,零自然被换到后面。一遍扫描原地完成,空间 O(1)。
三、正确代码
基础写法(新建表拼接):
local function moveZeroNew(t)
local nz = {}
for _, v in ipairs(t) do
if v ~= 0 then nz[#nz + 1] = v end
end
for i = #nz + 1, #t do nz[i] = 0 end
return nz
end
进阶写法(双指针原地交换):
local function moveZero(t)
local slow = 1
for fast = 1, #t do
if t[fast] ~= 0 then
t[slow], t[fast] = t[fast], t[slow]
slow = slow + 1
end
end
return t
end
local p = getplayerbyname("zero01")
sendmsg(p, 1, table.concat(
moveZero({0, 1, 0, 3, 12}), ","))
四、引擎验证
{0,1,0,3,12} 输出 1,3,12,0,0;非零元素相对顺序不变,零全部移到末尾。
五、FAQ
问:为什么用交换而非覆盖?
答:覆盖会丢数据,交换保持总数不变。
问:能只记非零个数吗?
答:可以但会打乱非零的相对顺序。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、先抛一个坑 影爆类技能为什么非要给目标头顶挂一个倒计时圈,引信到点自动炸不行吗?自动炸的版本省了倒计时圈,…
【游戏功能】 一、一个记不住的记忆灯序 回声记忆类玩法的首版测试,玩家第二轮就全军覆没。不是难度问题——灯序只有三步;是播放…
【游戏功能】 一、一个永远无解的谜题 光点翻转类解谜的第一版被测试打回:"第三关无解。"排查逻辑:点一个光点,它与上下左右四…
【游戏功能】 一、一个永远差一步的跳台 蓄力跳台玩法首版,玩家的抱怨高度一致:"按半秒和按三秒跳得一样远,那蓄力条是装饰吗?…
【游戏功能】 一、先抛一个坑 套圈摊位的圈扔出去,为什么有的游戏圈是抛物线飘过去的,有的是直线飞过去的?直线圈的判定简单,但…
【游戏功能】 一、一个被指针出卖的开箱 横向开箱卷轴首版上线,最刻薄的评论是:"减速那两秒我知道自己要出什么了,就问你尴尬不…