在当今的编程世界中,Lua语言以其简洁、高效的特点在游戏开发、嵌入式系统等领域中广泛应用。对于想要在技术挑战中脱颖而出的人来说,熟练掌握Lua编程技能至关重要。本文将为你揭秘60道Lua编程实战题,助你轻松通关技术挑战。
Lua基础语法
在开始实战之前,让我们先回顾一下Lua的基础语法。以下是一些Lua编程的基础知识:
变量声明
local a = 10
local b = "hello world"
数据类型
Lua支持多种数据类型,包括:
- 数字(Number)
- 字符串(String)
- 布尔值(Boolean)
- 表(Table)
- 函数(Function)
- 任意类型(Any)
控制结构
if a > 10 then
print("a大于10")
elseif a < 10 then
print("a小于10")
else
print("a等于10")
end
for i = 1, 5 do
print(i)
end
函数定义
function add(a, b)
return a + b
end
print(add(3, 4))
Lua编程实战60题
以下是我们精心准备的60道Lua编程实战题,涵盖了Lua编程的各个方面:
1. 打印1到100的偶数
for i = 1, 100 do
if i % 2 == 0 then
print(i)
end
end
2. 实现一个字符串反转函数
function reverse(str)
local len = string.len(str)
local reversed = ""
for i = len, 1, -1 do
reversed = reversed .. string.sub(str, i, i)
end
return reversed
end
print(reverse("hello world"))
3. 实现一个冒泡排序函数
function bubbleSort(arr)
local len = #arr
for i = 1, len do
for j = 1, len - i do
if arr[j] > arr[j + 1] then
arr[j], arr[j + 1] = arr[j + 1], arr[j]
end
end
end
return arr
end
print(bubbleSort({5, 2, 9, 1, 5, 6}))
4. 实现一个递归阶乘函数
function factorial(n)
if n == 0 then
return 1
else
return n * factorial(n - 1)
end
end
print(factorial(5))
5. 实现一个字符串匹配函数
function findSubstring(str, substr)
local pos = string.find(str, substr)
if pos then
return pos
else
return nil
end
end
print(findSubstring("hello world", "world"))
6. 实现一个二分查找函数
function binarySearch(arr, target)
local left, right = 1, #arr
while left <= right do
local mid = math.floor((left + right) / 2)
if arr[mid] == target then
return mid
elseif arr[mid] < target then
left = mid + 1
else
right = mid - 1
end
end
return nil
end
print(binarySearch({1, 2, 3, 4, 5, 6}, 4))
7. 实现一个链表反转函数
Node = {}
function Node:new(value)
local obj = {}
self.__index = self
obj.value = value
obj.next = nil
return obj
end
function reverseList(head)
local prev, current = nil, head
while current do
local next = current.next
current.next = prev
prev = current
current = next
end
return prev
end
head = Node:new(1)
head.next = Node:new(2)
head.next.next = Node:new(3)
newHead = reverseList(head)
while newHead do
print(newHead.value)
newHead = newHead.next
end
8. 实现一个快速排序函数
function quickSort(arr)
if #arr <= 1 then
return arr
end
local pivot = arr[1]
local left = {}
local right = {}
for i = 2, #arr do
if arr[i] < pivot then
table.insert(left, arr[i])
else
table.insert(right, arr[i])
end
end
return table.concat(quickSort(left), quickSort(right), pivot)
end
print(quickSort({5, 2, 9, 1, 5, 6}))
9. 实现一个二叉搜索树插入函数
BinaryTreeNode = {}
function BinaryTreeNode:new(value)
local obj = {}
self.__index = self
obj.value = value
obj.left = nil
obj.right = nil
return obj
end
function insert(root, value)
if root == nil then
return BinaryTreeNode:new(value)
end
if value < root.value then
root.left = insert(root.left, value)
else
root.right = insert(root.right, value)
end
return root
end
root = nil
root = insert(root, 5)
root = insert(root, 2)
root = insert(root, 9)
root = insert(root, 1)
root = insert(root, 5)
root = insert(root, 6)
function inOrderTraversal(root)
if root then
inOrderTraversal(root.left)
print(root.value)
inOrderTraversal(root.right)
end
end
inOrderTraversal(root)
10. 实现一个哈希表插入函数
HashTable = {}
function HashTable:new(size)
local obj = {}
self.__index = self
obj.size = size
obj.table = {}
for i = 1, size do
obj.table[i] = nil
end
return obj
end
function HashTable:insert(key, value)
local hash = key % self.size
local inserted = false
if self.table[hash] == nil then
self.table[hash] = {key, value}
inserted = true
else
local prevKey, prevValue = self.table[hash][1], self.table[hash][2]
while true do
local nextHash = (hash + 1) % self.size
if self.table[nextHash] == nil then
self.table[nextHash] = {key, value}
inserted = true
break
elseif self.table[nextHash][1] == prevKey then
table.insert(self.table[nextHash], value)
break
else
prevKey, prevValue, hash = self.table[nextHash][1], self.table[nextHash][2], nextHash
end
end
end
if not inserted then
error("Error: Hash table overflow")
end
end
hashTable = HashTable:new(10)
hashTable:insert("key1", "value1")
hashTable:insert("key2", "value2")
hashTable:insert("key3", "value3")
for i = 1, 10 do
if hashTable.table[i] then
print(hashTable.table[i][1], hashTable.table[i][2])
else
print("nil")
end
end
11. 实现一个最小栈函数
MinStack = {}
function MinStack:new()
local obj = {}
self.__index = self
obj.stack = {}
obj.minStack = {}
return obj
end
function MinStack:push(value)
table.insert(self.stack, value)
if #self.minStack == 0 or value <= self.minStack[#self.minStack] then
table.insert(self.minStack, value)
end
end
function MinStack:pop()
if self.stack[#self.stack] == self.minStack[#self.minStack] then
table.remove(self.minStack)
end
return table.remove(self.stack)
end
function MinStack:min()
return self.minStack[#self.minStack]
end
minStack = MinStack:new()
minStack:push(10)
minStack:push(20)
print(minStack:min()) -- 输出 10
minStack:pop()
print(minStack:min()) -- 输出 20
minStack:pop()
print(minStack:min()) -- 输出 nil
12. 实现一个二叉树层序遍历函数
function levelOrderTraversal(root)
local queue = {root}
while #queue > 0 do
local node = table.remove(queue, 1)
print(node.value)
if node.left then
table.insert(queue, node.left)
end
if node.right then
table.insert(queue, node.right)
end
end
end
root = BinaryTreeNode:new(1)
root.left = BinaryTreeNode:new(2)
root.right = BinaryTreeNode:new(3)
root.left.left = BinaryTreeNode:new(4)
root.left.right = BinaryTreeNode:new(5)
root.right.left = BinaryTreeNode:new(6)
root.right.right = BinaryTreeNode:new(7)
levelOrderTraversal(root)
13. 实现一个最大堆函数
MaxHeap = {}
function MaxHeap:new(size)
local obj = {}
self.__index = self
obj.size = size
obj.heap = {}
return obj
end
function MaxHeap:buildHeap()
for i = math.floor(self.size / 2), 1, -1 do
self:heapify(i)
end
end
function MaxHeap:heapify(index)
local left = 2 * index
local right = 2 * index + 1
local largest = index
if left <= self.size and self.heap[left] > self.heap[largest] then
largest = left
end
if right <= self.size and self.heap[right] > self.heap[largest] then
largest = right
end
if largest ~= index then
self.heap[index], self.heap[largest] = self.heap[largest], self.heap[index]
self:heapify(largest)
end
end
function MaxHeap:insert(value)
table.insert(self.heap, value)
self:size = self:size + 1
self:heapify(self:size)
end
function MaxHeap:extractMax()
if self:size > 0 then
local max = self.heap[1]
self.heap[1] = self.heap[self:size]
self:size = self:size - 1
self:heapify(1)
return max
else
return nil
end
end
maxHeap = MaxHeap:new(10)
maxHeap:buildHeap()
maxHeap:insert(10)
maxHeap:insert(20)
maxHeap:insert(15)
print(maxHeap:extractMax()) -- 输出 20
print(maxHeap:extractMax()) -- 输出 15
print(maxHeap:extractMax()) -- 输出 10
14. 实现一个最小堆函数
MinHeap = {}
function MinHeap:new(size)
local obj = {}
self.__index = self
obj.size = size
obj.heap = {}
return obj
end
function MinHeap:buildHeap()
for i = math.floor(self.size / 2), 1, -1 do
self:heapify(i)
end
end
function MinHeap:heapify(index)
local left = 2 * index
local right = 2 * index + 1
local smallest = index
if left <= self.size and self.heap[left] < self.heap[smallest] then
smallest = left
end
if right <= self.size and self.heap[right] < self.heap[smallest] then
smallest = right
end
if smallest ~= index then
self.heap[index], self.heap[smallest] = self.heap[smallest], self.heap[index]
self:heapify(smallest)
end
end
function MinHeap:insert(value)
table.insert(self.heap, value)
self:size = self:size + 1
self:heapify(self:size)
end
function MinHeap:extractMin()
if self:size > 0 then
local min = self.heap[1]
self.heap[1] = self.heap[self:size]
self:size = self:size - 1
self:heapify(1)
return min
else
return nil
end
end
minHeap = MinHeap:new(10)
minHeap:buildHeap()
minHeap:insert(10)
minHeap:insert(20)
minHeap:insert(15)
print(minHeap:extractMin()) -- 输出 10
print(minHeap:extractMin()) -- 输出 15
print(minHeap:extractMin()) -- 输出 20
15. 实现一个二叉树深度优先遍历函数
function dfs(root)
if root then
print(root.value)
dfs(root.left)
dfs(root.right)
end
end
dfs(root)
16. 实现一个二叉树广度优先遍历函数
function bfs(root)
local queue = {root}
while #queue > 0 do
local node = table.remove(queue, 1)
print(node.value)
if node.left then
table.insert(queue, node.left)
end
if node.right then
table.insert(queue, node.right)
end
end
end
bfs(root)
17. 实现一个字符串匹配算法(KMP算法)
function kmpMatch(text, pattern)
local m = #pattern
local lps = {}
local i, j = 1, 0
while i < m do
if pattern[i] == pattern[j] then
j = j + 1
lps[i] = j
i = i + 1
else
if j ~= 0 then
j = lps[j - 1]
else
lps[i] = 0
i = i + 1
end
end
end
i, j = 1, 1
local result = {}
while i <= #text do
if pattern[j] == text[i] then
i = i + 1
j = j + 1
end
if j == m then
table.insert(result, i - j)
j = lps[j - 1]
elseif i < #text and pattern[j] ~= text[i] then
if j ~= 0 then
j = lps[j - 1]
else
i = i + 1
end
end
end
return result
end
print(kmpMatch("ababababab", "abab"))
18. 实现一个二分查找树插入函数
BinarySearchTree = {}
function BinarySearchTree:new()
local obj = {}
self.__index = self
obj.root = nil
return obj
end
function BinarySearchTree:insert(value)
local node = BinaryTreeNode:new(value)
if not self.root then
self.root = node
return
end
local current = self.root
while true do
if value < current.value then
if not current.left then
current.left = node
return
end
current = current.left
else
if not current.right then
current.right = node
return
end
current = current.right
end
end
end
bst = BinarySearchTree:new()
bst:insert(5)
bst:insert(2)
bst:insert(9)
bst:insert(1)
bst:insert(5)
bst:insert(6)
function inOrderTraversal(root)
if root then
inOrderTraversal(root.left)
print(root.value)
inOrderTraversal(root.right)
end
end
inOrderTraversal(bst.root)
19. 实现一个二分查找树删除函数
function BinarySearchTree:delete(value)
self.root = self:deleteNode(self.root, value)
end
function BinarySearchTree:deleteNode(root, value)
if not root then
return nil
end
if value < root.value then
root.left = self:deleteNode(root.left, value)
elseif value > root.value then
root.right = self:deleteNode(root.right, value)
else
if not root.left then
return root.right
elseif not root.right then
return root.left
else
local successor = self:findMin(root.right)
root.value = successor.value
root.right = self:deleteNode(root.right, successor.value)
end
end
return root
end
function BinarySearchTree:findMin(node)
local current = node
while current.left do
current = current.left
end
return current
end
bst:delete(5)
inOrderTraversal(bst.root)
20. 实现一个二叉树查找函数
function BinarySearchTree:search(value)
local current = self.root
while current do
if value == current.value then
return true
elseif value < current.value then
current = current.left
else
current = current.right
end
end
return false
end
print(bst:search(5))
21. 实现一个二叉树中序遍历函数
function inOrderTraversal(root)
if root then
inOrderTraversal(root.left)
print(root.value)
inOrderTraversal(root.right)
end
end
inOrderTraversal(bst.root)
22. 实现一个二叉树后序遍历函数
function postOrderTraversal(root)
if root then
postOrderTraversal(root.left)
postOrderTraversal(root.right)
print(root.value)
end
end
postOrderTraversal(bst.root)
