Algorithm 编码大脑提示以更新数组(语言不可知)

Algorithm 编码大脑提示以更新数组(语言不可知),algorithm,puzzle,code-golf,Algorithm,Puzzle,Code Golf,全部, 我需要一种聪明的方法来尽可能快速、干净地实现此算法(用于工作): 我想我已经删除了所有特定于语言的问题,并将其归结为: 我有两个数组:A和B A中有一个名称列表{苹果,苹果,香蕉,香蕉,胡萝卜,}每个第i个值在A中出现的次数没有上限。可能只有一个“苹果”或无数个 A中的每个条目在B中都有一个匹配条目(多对多映射)。例如: A[0]=“苹果”B[0]=“0027” A[1]=“苹果”B[1]=“0028” A[2]=“香蕉”B[2]=“0073” A[3]=“香蕉”B[3]=“0041”

全部,

我需要一种聪明的方法来尽可能快速、干净地实现此算法(用于工作): 我想我已经删除了所有特定于语言的问题,并将其归结为:

我有两个数组:A和B

A中有一个名称列表{苹果,苹果,香蕉,香蕉,胡萝卜,}每个第i个值在A中出现的次数没有上限。可能只有一个“苹果”或无数个

A中的每个条目在B中都有一个匹配条目(多对多映射)。例如:

A[0]=“苹果”B[0]=“0027”
A[1]=“苹果”B[1]=“0028”
A[2]=“香蕉”B[2]=“0073”
A[3]=“香蕉”B[3]=“0041”
A[4]=“香蕉”B[4]=“0069”

如果A中有100个或更少的条目实例,(如果有我想建立一个字典/哈希表,类似

{'Apple':
    {'NumberSeen':102,
     'BValues':['0027','0041']
    },
 'Banana':
    {'NumberSeen':1,
     'BValues':['0123']
    }
}
然后循环这个,如果NumberSeen%100=1,则添加一个新的b值,然后从此字典重新创建b数组

编辑:这为您提供了一个可读的解决方案,可以处理未排序的列表。我刚才看到了您的“列表已排序”注释,这意味着您可以在O(1)空间中执行更简单的操作,但我不确定代码会有多清晰。

我在C中的建议#因为我没有回答这个问题并假设数组已排序

String[] A = GetAs();
String[] B = GetBs();

Int32 count = 0;
Int32 index = 1;

while (index < A.Length)
{
   if (A[index] != A[index - 1])
   {
      count = 0;
   }

   currentCount++;

   if ((A[index] == A[index - 1]) && (count % 100 != 1))
   {
      B[index] = B[index - 1];
   }

   index++;
}
String[]A=GetAs();
字符串[]B=GetBs();
Int32计数=0;
Int32指数=1;
while(索引
如果你喜欢的话,可以使用紧凑型(以及基于零的计数)

String[]A=GetAs();
字符串[]B=GetBs();
Int32 c=0,i=1;
while(i
字符串curFruit=A[0];
int CURBOUTHCOUNT=0;
for(int i=1;i
我非常喜欢Daniel Brückner的解决方案,但我认为您可能可以对其进行一个增强。假设“A”已排序,并且100个连续相同的结果很常见,那么您可以通过添加以下检查来利用这一点:

String[] A = GetAs();
String[] B = GetBs();
Int32 c = 0, i = 1;
while (i < A.Length)
{   
    if(i+99 < A.Length && A[i] == A[i+99])
    {
        for(int j=1;j<100;j++) b[i+j] = b[i];

        i = i+99;
    }
    else
    {
        B[i] = (A[i] == A[i - 1]) ? B[i - 1] : B[i];   
        i++;
    }
}
String[]A=GetAs();
字符串[]B=GetBs();
Int32 c=0,i=1;
while(i对于(intj=1;jSo)来说,工作时需要它,并将其标记为“乐趣”、“谜题”和“挑战”你可能不愿意为此付出任何代价?我明白了吗?老兄,我已经解决了它。我只是认为其他人可能会有更好的。有些人确实喜欢这些类型的谜题/挑战——至少我喜欢。你的数组是否总是按例排序?如果是的话-没有任何挑战…:(苹果=>i=0=>B[i+101]=B[101]=0069,而不是“0041”.是我错了还是你错了?或者这意味着,项目0…99得到项目0的值,其余项目100…*项目100的值?我认为currentCount%100==1,而不是currentCount==101。如果一行有202个苹果,该怎么办?将行为更正为模100。
c=(a[I]==a[I-1])?c+1:0;
可以是
c=(A[i]==A[i-1])*(c+1);
-保存分支任何短于101项的数组都会使其崩溃。我知道我应该再次校对它。我为此添加了一个检查。谢谢Dykam。
String curFruit = A[0];
int curFruitCount = 0;
for (int i = 1; i < A.length; i++) {
    if (A[i].equals(curFruit) && curFruitCount < 100) {
        B[i] = B[i-1];
        curFruitCount++;
    }else{
        curFruit = A[i];
        curFruitCount = 1;
    }
}
String[] A = GetAs();
String[] B = GetBs();
Int32 c = 0, i = 1;
while (i < A.Length)
{   
    if(i+99 < A.Length && A[i] == A[i+99])
    {
        for(int j=1;j<100;j++) b[i+j] = b[i];

        i = i+99;
    }
    else
    {
        B[i] = (A[i] == A[i - 1]) ? B[i - 1] : B[i];   
        i++;
    }
}