全部,
我需要一种聪明的方法来尽可能快速和干净地实现这个算法(工作):我想我已经删除了所有语言特定的问题并将其归结为:
我有两个数组: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 个或更少的条目实例(如果有 <= 100 个香蕉),那么它们必须共享相同的初始“B”值。如果超过 100 个,则前 100 个必须共享相同的 B 值,但接下来的 100 个将具有第 B[i + 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:感谢丹尼尔指出我的愚蠢错误。
我的解决方案只是为了比较(伪代码):
首先制作 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];
}
从记忆中做到这一点,希望我没有搞砸索引......