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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章