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

Arrays 是否可以在O(n)时间内输出包含数组元素(压缩非连续副本)的字符串?,arrays,string,lua,time-complexity,Arrays,String,Lua,Time Complexity,问题:给定一个可能包含非连续重复元素的数组,如何输出字符串以按数量出现的顺序显示数量 这里有一个小的解释,跳过下面的问题。有人向我提出了一个问题,即在一个数组中输出重复的、连续的字符串,这样给定一个数组,就会大量输出一个新字符串 鉴于: local Items = {"Wood", "Wood", "Wood", "Rope", "Rope"} local Items = {"Wood", "Wood", "Wood", "Rope", "Rope", "Wood"} 产出将是: 3x Wo

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

这里有一个小的解释,跳过下面的问题。有人向我提出了一个问题,即在一个数组中输出重复的、连续的字符串,这样给定一个数组,就会大量输出一个新字符串

鉴于:

local Items = {"Wood", "Wood", "Wood", "Rope", "Rope"}
local Items = {"Wood", "Wood", "Wood", "Rope", "Rope", "Wood"}
产出将是:

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)
输出:

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)
localunpaceditems=“”
本地检查={}
本地索引=1

当索引时,以下代码统计非连续重复项:

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表在固定时间内更新计数


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

(欢迎使用!)
我的问题是,非连续重复项怎么办?
在您的帖子中显示得非常清楚:请尽量不要让读者走上不需要的道路。(标题可能是一个好地方。您是否消化过)哈希表实现在每个成员查询/更新时都需要恒定的“预期”时间。@greybeard您肯定是对的。这是我的错误。从OP:“你怎么能输出一个字符串来按数量出现的顺序显示数量?”这个输出不是没有特定的排序顺序吗
pairs()
不会按原始密钥创建顺序返回内容,是吗?感谢您的回复。我说明了我不想使用这种散列部分的原因,因为它不会保留顺序。如果我不清楚,很抱歉。如果不清楚,可能会在最后再次迭代项目,并且(伪代码)如果计数[v],则打印项目并计数[v];删除计数[v];下一步?在Java中,默认的迭代顺序是插入顺序。@Charlie是的,因为字符串不能与数字冲突,所以相同的表用于这两个目的。而big-O表示法吃常数——即使迭代一百万次(只要那一百万次不依赖于事物的数量),仍然是O(n)。这里,您正在执行
n+m
步骤(其中
n
是初始列表的长度,
m
是唯一项的数量)。设置
m=c*n
其中
0