如何将模式从一个数组更改为另一个数组然后再返回

时间:2014-03-10 18:34:12

标签: c++ arrays algorithm sorting

我在C ++中有一个原始数组,可以包含任何数字并改变长度,但这是我的例子,其中包含以下简单内容:

{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

我想要的是改变数组的顺序 通过将数组拆分为动态大小的块,比如说3(可能是其他大小)。

int len = 10;
int blocks = 10/3;

并使用这些值将数组拆分为大约3个数字的块:

0,1,2 | 3,4,5 | 6,7,8 | 9

然后从第一个块获取第一个值,从下一个块获取下一个值,如:

0,3, 1,4, 2,5,

然后跳过两个街区并添加下一个部分,如:

6,9, 7, 8

7和8将是独立的,因为在这两个数字的最后一个块中没有更多的部分。 完整的结果应该是:

0,3,1,4,2,5,6,9,7,8

如果最后一个块有时可能不包含一组完整的数字,我怎么能用算法解决这个问题呢?

然后我怎么能创建一个算法来将结果数组反转回原来的数据呢?

并且这不是一个任务,我将使用它来改变声音文件,使其他人很难复制文件并随意使用它。

编辑:这是我上次尝试的最后一次尝试:

static int test[] = { 0 ,1 ,2, 3, 4, 5, 6, 7, 8, 9};
static int testTo[] = { -1 ,-1 ,-1, -1, -1, -1, -1, -1, -1, -1};
int _tmain(int argc, _TCHAR* argv[])
{
    int len = 10;
    int block = len/3.0;
    for (int i=0;i<len;i=i+block*2)
    {
        for (int y=0;y<block&&i+(y*2)+1<len-1;y++)
        {
            testTo[i+(y*2)] = test[i+y];
            testTo[i+(y*2)+1] = test[(i+block)+y];
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

最简单的解决方法是分离出testTo计数器,这使我们不必担心复杂的代码与数组的末尾一起工作 - 我们可以愉快地生成超出范围的索引,然后简单地忽略他们通过检查我们是否已经超出界限。

我还以为我会简化你的代码。

这就是我提出的:

int test[] = { 0 ,1 ,2, 3, 4, 5, 6, 7, 8, 9};
int testTo[] = { -1 ,-1 ,-1, -1, -1, -1, -1, -1, -1, -1};
int len = 10;
int block = len/3.0;
int counter = 0;
for (int i = 0; i < len; i = i + block*2)
   for (int y = 0; y < block; y++)
      for (int z = 0; z < 2; z++) // made this a loop rather than 2 statements
      {
         int index = i + y + z*block;
         if (index < len)
            testTo[counter++] = test[index];
      }

Live demo


当尝试将数据转换回来时,数组的末尾会带来更多问题。

是否可以只使用一些未使用的值(比如0)填充最后一对块?所以我们得到:

0,1,2 | 3,4,5 | 6,7,8 | 9,0,0

这会给我们一个输出:

0,3,1,4,2,5,6,9,7,0,8,0

转换回来会更容易。

或者,如果您仍然坚持使用您的结构,或者无论如何都想冒着代码:

在处理最后一对块时,您可以根据数组中剩余的元素数量来做您需要做的事情。请注意我们最后一对块中有4个元素(6,9,7,8),现在还注意到数据的格式为firstBlock secondBlock firstBlock firstBlock - 我们在块之间交替一次,然后用完第二个块中的元素,所以只需从第一个块中选择。更一般地说,我们交替的次数(以及第二个块中的项目数)是elementsRemaining - blockSize,在这种情况下为4-3=1