【Lua】题目小练11

-- 题目1:-- 给定表 t = {"apple", "banana", "apple", "orange", "banana", "apple"}

-- 写一个函数 countFreq(tbl) 返回一个新表,统计每个元素出现次数

-- 例如:返回 {apple=3, banana=2, orange=1}

Lua 复制代码
local function countFreq(tbl)
    local result = {}
    for _, v in pairs(tbl) do
        result[v] = (result[v] or 0) + 1
    end
    return result
end

-- 测试题目1
local t1 = {"apple", "banana", "apple", "orange", "banana", "apple"}
local freq = countFreq(t1)
print("题目1结果:")
for key, value in pairs(freq) do
    print(key .. ": " .. value)
end
print()

-- 题目 2:合并表

-- 给定两个表 t1 = {1,2,3} 和 t2 = {4,5,6}

-- 写一个函数 mergeTable(t1, t2) 返回一个合并后的表 {1,2,3,4,5,6}

Lua 复制代码
local function mergeTable(t1, t2)
    local result = {}
    -- 复制t1的元素
    for i, v in ipairs(t1) do
        result[i] = v
    end
    -- 添加t2的元素
    for i, v in ipairs(t2) do
        table.insert(result, v)
    end
    return result
end

-- 测试题目2
local table1 = {1,2,3}
local table2 = {4,5,6}
local merged = mergeTable(table1, table2)
print("题目2结果:")
for i, v in ipairs(merged) do
    print(i .. ": " .. v)
end
print()

-- 题目3:惰性计数器

-- 写一个函数 makeCounter(start)

-- 返回一个函数,每次调用返回计数器的下一个值

-- 例如:

-- c = makeCounter(10)

-- print(c()) --> 11

-- print(c()) --> 12

Lua 复制代码
local function makeCounter(start)
    if type(start) ~= "number" then
        error("起始值必须是数字")
    end
    
    local count = start
    
    return function()
        count = count + 1
        return count
    end
end

-- 测试题目3
print("题目3结果:")
local c = makeCounter(10)
print("第一次调用:", c()) --> 11
print("第二次调用:", c()) --> 12
print("第三次调用:", c()) --> 13
print()

-- 题目 4:高阶函数 map

-- 写一个函数 map(tbl, func)

-- 返回一个新表,每个元素是 func(原元素) 的返回值

-- 例如:map({1,2,3}, function(x) return x^2 end) 返回 {1,4,9}

Lua 复制代码
local function map(tbl, func)
    local result = {}
    for i, v in ipairs(tbl) do
        result[i] = func(v)
    end
    return result
end

-- 测试题目4
print("题目4结果:")
local numbers = {1, 2, 3}
local squares = map(numbers, function(x) return x^2 end)
for i, v in ipairs(squares) do
    print(i .. ": " .. v)
end
print()

-- 题目5:提取数字

-- 写一个函数 extractNumbers(str)

-- 输入:"a1b23c456"

-- 输出表 {1,23,456}

Lua 复制代码
local function extractNumbers(str)
    local result = {}
    for num in str:gmatch("%d+") do  -- gmatch会找到所有匹配的数字
        table.insert(result, tonumber(num))
    end
    return result
end

-- 测试题目5
print("题目5结果:")
local numbers = extractNumbers("a1b23c456")
for i, v in ipairs(numbers) do
    print(i .. ": " .. v)
end
print()

-- 题目6:邮箱验证

-- 写一个函数 isEmail(str)

-- 如果 str 是邮箱格式(xxx@yyy.zzz)返回 true,否则 false

-- 使用 Lua 模式匹配

Lua 复制代码
local function isEmail(str)
    if type(str) ~= "string" then
        return false
    end
    -- 更合理的邮箱模式:至少一个字符@至少一个字符.至少一个字符
    local pattern = "^[%w%.%-_]+@[%w%.%-]+%.%w+$"
    return str:match(pattern) ~= nil
end

-- 测试题目6
print("题目6结果:")
print("test@example.com:", isEmail("test@example.com"))
print("invalid.email:", isEmail("invalid.email"))
print("user@domain.co.uk:", isEmail("user@domain.co.uk"))
print()

-- 题目 7:学生成绩表

-- 有学生表 students = {

-- {name="Tom", score={math=90, english=85}},

-- {name="Lucy", score={math=95, english=92}},

-- {name="Jack", score={math=85, english=88}}

-- }

-- 写函数 averageMath(students) 返回数学平均分

Lua 复制代码
local function averageMath(students)
    local sum = 0
    local count = 0
    for _, student in ipairs(students) do
        sum = sum + student.score.math
        count = count + 1
    end
    return sum / count
end

-- 测试题目7
print("题目7结果:")
local students = {
   {name="Tom", score={math=90, english=85}},
   {name="Lucy", score={math=95, english=92}},
   {name="Jack", score={math=85, english=88}}
}
print("数学平均分:", averageMath(students))
print()

-- 题目 8:去重并排序

-- 给定表 t = {5,2,7,2,3,5,8,1}

-- 写一个函数 uniqueSort(tbl)

-- 返回一个新表,内容去重并从小到大排序 {1,2,3,5,7,8}

Lua 复制代码
local function uniqueSort(tbl)
    if type(tbl) ~= "table" then  -- 这里原来写错了
        print("输入错误")
        return nil
    end
    
    -- 用哈希表去重
    local seen = {}
    local unique = {}
    
    for _, v in ipairs(tbl) do
        if not seen[v] then
            seen[v] = true
            table.insert(unique, v)
        end
    end
    
    -- 排序
    table.sort(unique)
    
    return unique
end

-- 测试题目8
print("题目8结果:")
local testArray = {5,2,7,2,3,5,8,1}
local result = uniqueSort(testArray)
for i, v in ipairs(result) do
    print(i .. ": " .. v)
end
print()

-- 题目 9:嵌套表深度求和

-- 给定表 t = {1, {2, 3}, {4, {5, 6}}}

-- 写函数 sumNested(tbl) 返回所有数字的和 1+2+3+4+5+6 = 21

Lua 复制代码
local function sumNested(tbl)
    if type(tbl) ~= "table" then
        return 0  -- 返回0而不是nil更好
    end

    local sum = 0
    for _, value in ipairs(tbl) do
        if type(value) == "number" then
            sum = sum + value
        elseif type(value) == "table" then
            sum = sum + sumNested(value)
        end
    end

    return sum
end

-- 测试题目9
print("题目9结果:")
local nestedTable = {1, {2, 3}, {4, {5, 6}}}
print("嵌套表总和:", sumNested(nestedTable))