最近会写一些Lua在项目中用到的和平时遇到的一些算法之类的文章,笔者也是菜鸟小白一枚,如果有错误的地方还请多多指点。
题目描述:判断一个数组是否有序,数组中0可以用来补差值
算法步骤:
1.数组为nil直接返回false
2.数组不为nil,如果数组只包含一个元素肯定有序,如果包含2个及以上需要进行判定(a.如果数组元素都为0则肯定有序,如果不全为0,则需要进行判定)
3.正常判定流程,先将数组排序,计算出0的个数(用zeroCount表示)和第一个非0元素的索引(用numIndex表示),之后就是比较非0元素的下一元素和当前元素之差(两个元素之差用diff表示),最后判断0的个数和元素之差,如果zeroCount<diff则肯定不是有序,否则zeroCount = zeroCount - diff,使用zeroCount继续进行判断。
lua代码如下:
--判断一个数组是否有序,数组中0可以用来补差值
function OrderedArray(tbl)
if tbl == nil then
return false
end
--有一个元素的数组肯定是有序的
if tbl ~= nil and #tbl ==1 then
return true
end
--将数组排序
for k,v in pairs(tbl) do
print("original-k,v=",k,v)
end
table.sort(tbl)
for k,v in pairs(tbl) do
print("sorted-k,v=",k,v)
end
local zeroCount = 0 -- 统计数组中0的个数
local numIndex = 0 --记录排序后数组中第一个非0数字的索引
for k,v in pairs(tbl) do
if v == 0 then
zeroCount = zeroCount + 1
else
numIndex = k
break
end
end
if zeroCount == #tbl then
return true
end
print("zeroCount,numIndex=",zeroCount,numIndex);
for i=numIndex+1,#tbl do
--如果两个数相差1就是有序,不是相差1才进行后续判断
if tbl[i] ~= tbl[i-1] + 1 then
local diff = tbl[i] - tbl[i-1] -1 --计算两数相差几
if zeroCount >= diff then
--如果0的个数大于等于两数的差值,则满足有序条件,继续判断
zeroCount = zeroCount - diff
else
--如果0的个数小于两数的差值,0补全也不会是有序,直接返回false
return false
end
end
end
return true
end
local test1 = {0}
local test2 = {0,0}
local test3 = {0,5}
local test4 = {1,2,0}
local test5 = {1,0,0,0,5}
local test6 = {6,0,0,0,1}
print(OrderedArray(test6))
lua运行结果: