【发布时间】:2009-09-04 12:29:00
【问题描述】:
全部,
我需要一种聪明的方法来尽可能快速、干净地实现这个算法(用于工作): 我想我已经删除了所有特定于语言的问题并将其归结为:
我有两个数组:A 和 B。
A 中有一个名称列表 {Apple, Apple, Banana, Banana, Banana, Carrot, ...} 每个第 i 个值在 A 中出现的次数没有上限。可以只是一个“苹果”或无数个。
A 中的每个条目在 B 中都有一个匹配的条目。(多对多映射)。例如:
A[0] = "Apple" B[0] = "0027"
A[1] = "Apple" B[1] = "0028"
A[2] = "Banana" B[2] = "0073"
A[3] = "Banana" B[3] = "0041"
A[4] = "Banana" B[4] = "0069"
如果 A 中有 100 个或更少的条目实例(如果有
例如,如果有 102 个苹果
A[0] = "Apple" B[0] = "0027"
A[1] = "Apple" B[1] = "0028"
...
A[99] = "Apple" B[99] = "0073"
A[100] = "Apple" B[100] = "0041"
A[101] = "Apple" B[101] = "0069"
A[102] = "Banana" B[102] = "0123"
那么我想要的结果是这样的:
A[0] = "Apple" B[0] = "0027"
A[1] = "Apple" B[1] = "0027"
...
A[99] = "Apple" B[99] = "0027"
A[100] = "Apple" B[100] = "0041"
A[101] = "Apple" B[101] = "0041"
A[102] = "Banana" B[102] = "0123"
我敢肯定有一些超级大脑可以想出我设计的蹩脚算法,所以让我们看看吧!
编辑 1: 我想我应该指出这是 工作。我认为这是一个有趣的挑战,有人可能会想看看,并且可能会想出比我想出的解决方案更好的解决方案。
编辑 2:感谢 daniel 指出我的愚蠢错误。
我的解决方案只是为了比较(伪代码):
首先制作 B 的哈希/字典,称为 d,其中 d[ "Apple" ] = A 中 Apple 的实例数。
while (i < A.count)
{
string cmp = A[i];
int v = d[cmp];
int j=i;
while (v--) {
B[j++] = B[i];
if (j %100 == 0)
i += j
}
i+= d[cmp];
}
凭记忆这样做,希望我没有搞砸索引...
【问题讨论】:
-
那么,你需要这个来工作并将其标记为“有趣”、“拼图”和“挑战”吗?而且您可能不愿意为此付出任何代价?我没听错吗?
-
老兄,我已经解决了。我只是觉得其他人可能有更好的东西。有些人确实喜欢这类谜题/挑战——至少我喜欢。
-
你的 A 数组是否总是排序的,就像你在例子中展示的那样?如果是这样 - 没有任何挑战...... :(
-
Apple => i = 0 => B[i + 101] = B[101] = "0069",而不是 "0041"。是我错了还是你错了?
-
还是说,第 0...99 项获得第 0 项的值,其余第 100 项...* 获得第 100 项的值?
标签: algorithm puzzle code-golf