Lua实战之判断连续

判断数列连续性算法

目录

Description

Implemention

Plan A

Plan B


Description

判断表中的数是否连续,0可以代表任意数!

e.g.

{5, 8, 0, 1, 4, 2, 0, 6}是连续的!

Implemention

Plan A

local testTbl1 = {5, 8, 0, 1, 4, 2, 0, 6}

function jungleContinuation1(targetTbl)
    -- step1:统计0的个数,并将其从目标table中移除
    local zeroCnt = 0
    for i = #targetTbl, 1, -1 do
        if targetTbl[i] == 0 then
            zeroCnt = zeroCnt + 1
            table.remove(targetTbl, i)
        end
    end

    -- step2:排序
    table.sort(targetTbl, function(a, b)
        return a < b
    end)

    -- step3:统计连续情况下需要补0的数量
    local intervalCnt, sufEle = 0, targetTbl[#targetTbl]
    for i = #targetTbl-1, 1, -1 do
        if targetTbl[i] == sufEle then  -- 有相等的必不连续
            return false
        end
        local interval = sufEle - targetTbl[i] - 1
        intervalCnt = intervalCnt + interval
        sufEle = targetTbl[i]
    end

    return intervalCnt <= zeroCnt
end

print("testTbl1中的数是否连续:", jungleContinuation1(testTbl1))

Plan B

local testTbl2 = {5, 8, 0, 1, 4, 2, 0, 6}

function jungleContinuation2(targetTbl)
    -- step1:目标table的原始元素个数
    local eleCount = #targetTbl

    -- step2:移除目标table中的0
    for i = #targetTbl, 1, -1 do
        if targetTbl[i] == 0 then
            table.remove(targetTbl, i)
        end
    end

    -- step3:排序
    table.sort(targetTbl, function(a, b)
        return a < b
    end)

    -- step4:判断是否有相等的元素
    local preEle = targetTbl[1]
    for i = 2, #targetTbl do
        if targetTbl[i] == preEle then
            return false
        end
        preEle = targetTbl[i]
    end

    -- step5:计算首尾元素的差值
    local diffNum = targetTbl[#targetTbl] - targetTbl[1]

    return diffNum+1 <= eleCount
end

print("testTbl2中的数是否连续:", jungleContinuation2(testTbl2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fightsyj

您的鼓励将是我分享的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值