You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua实现Two Sum问题遇table.find调用nil值报错求助

Lua实现Two Sum问题:报错解决与算法思路

先解决你的报错问题

你遇到的attempt to call a nil value (field 'find')错误,是因为Lua标准库的table模块根本没有table.find这个函数。要找数组中元素的索引,得自己实现查找逻辑,或者用循环遍历查找。

给你修改后的可运行代码:

num = {2,7,11,15}
target = 9
current = 0 

-- 自定义查找元素索引的函数
local function get_index(arr, val)
    for i, v in ipairs(arr) do
        if v == val then
            return i
        end
    end
    return nil
end

repeat
  createNum1 = num[math.random(1,#num)]
  createNum2 = num[math.random(1,#num)]
  current = createNum1 + createNum2
until current == target

print(get_index(num, createNum1), get_index(num, createNum2))

另外,原代码里tonumber(num[...])是多余的——数组里的元素本身就是数字类型,不需要再转换。

聊聊Two Sum的正确算法思路

你现在用的随机数凑数方法完全是碰运气,数组越大,凑到正确结果的概率越低,实际开发中根本不会这么用。下面是两种正经的实现思路:

1. 暴力枚举法

最直接的思路:双重循环遍历数组,检查每一对元素的和是否等于target,找到就返回它们的索引。

Lua实现代码:

local function two_sum_bruteforce(arr, target)
    for i = 1, #arr do
        for j = i + 1, #arr do
            if arr[i] + arr[j] == target then
                return i, j
            end
        end
    end
    return nil, nil
end

num = {2,7,11,15}
target = 9
local idx1, idx2 = two_sum_bruteforce(num, target)
print(idx1, idx2) -- 输出 1 2

优点:逻辑简单,不用额外空间;缺点:时间复杂度为O(n²),数组元素多的时候速度很慢。

2. 哈希表优化法

用空间换时间:遍历数组时,用一个Lua表(相当于哈希表)存储已经遍历过的元素及其索引。对每个当前元素,计算需要的补数(target - 当前元素),如果补数已经在哈希表里,说明之前遍历过这个补数,直接返回两个索引即可。

Lua实现代码:

local function two_sum_hash(arr, target)
    local num_map = {}
    for i, v in ipairs(arr) do
        local complement = target - v
        if num_map[complement] then
            return num_map[complement], i
        end
        num_map[v] = i
    end
    return nil, nil
end

num = {2,7,11,15}
target = 9
local idx1, idx2 = two_sum_hash(num, target)
print(idx1, idx2) -- 输出 1 2

优点:时间复杂度O(n),只需要遍历一次数组;缺点:需要额外的表存储元素,空间复杂度O(n)。

内容的提问来源于stack exchange,提问作者TDumitru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:24:09