是否可以在O(n)时间内输出包含数组元素(压缩非连续重复项)的字符串?

时间:2017-08-19 17:15:04

标签: arrays string lua time-complexity

问题:给定一个可能包含非连续重复元素的数组,如何输出一个字符串以按它们出现的顺序显示数量?

这里有一点展示,请在下面跳过我的问题。我提出了一个问题,输出在数组中排序的重复的连续字符串,这样给定一个数组,就会输出一个新的字符串。

假设:

local Items = {"Wood", "Wood", "Wood", "Rope", "Rope"}

输出结果为:

3x Wood 2x Rope 

我的方法是迭代数组并检查后续元素是否相等。然后我会增加一个计数器并将其添加到字符串中。

local unpackedItems = ""
local index = 1
while index <= #Items do
    local count = 1
    while Items[index] == Items[index + 1] do 
        count = count + 1
        index = index + 1 
    end
    unpackedItems = unpackedItems .. count .. "x " .. Items[index] .. " "
    index = index + 1
end
print(unpackedItems)

这很好,但我很好奇它是否会更好。

我的问题又是非连续重复的问题?给定一个可能包含重复元素的数组,如何输出一个字符串以按它们出现的顺序显示数量?

假设:

local Items = {"Wood", "Wood", "Wood", "Rope", "Rope", "Wood"}

输出:

4x Wood 2x Rope

我的解决方案是迭代数组并检查其他元素,并将检查的索引存储在哈希表中。

local unpackedItems = ""
local checked = {}
local index = 1
while index <= #Items do
    if not checked[index] then
        local count = 1
        local currentItem = Items[index]
        for index2 = index + 1, #Items do
            if not checked[index2] and currentItem == Items[index2] then
                checked[index2] = true
                count = count + 1
            end
        end
        unpackedItems = unpackedItems .. count .. "x " .. Items[index] .. " "
    end
    index = index + 1 
end
print(unpackedItems)

有没有更好的方法来实现这一点,也许时间复杂度为O(n)?对空间复杂性不太感兴趣。

另外,我每次都会连接字符串,这不会很昂贵,特别是对于较大的字符串?

我没有使用哈希表来表示数据或转换为原因的原因是它会丢失它出现的原始顺序。我考虑的另一个解决方案是将表转换为字符串并对其进行操作像这样,但那不会将每个元素视为自己的实体。我想防止名字&#34;冲突&#34;,&#34; Wood&#34;和&#34; Fire Wood&#34;可能不会单独处理。

使用的语言是Lua,但我也很想看到任何语言的解决方案。

1 个答案:

答案 0 :(得分:2)

以下代码计算非连续重复项:

local Items = {"Wood", "Wood", "Wood", "Rope", "Rope", "Wood"}
local Count = {}
local n = 0

for i,v in ipairs(Items) do
    if Count[v]==nil then
        n=n+1
        Count[n]=v
        Count[v]=0
    end
    Count[v]=Count[v]+1
end

for k,v in ipairs(Count) do
    print(k,v,Count[v])
end

这是一个典型的Lua解决方案:它利用Lua表在固定时间内更新计数。

代码使用Count有两个目的:计算重复项并记录值的显示顺序。