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