Lua随笔系列一:数组有序

最近会写一些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运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值