繁体   English   中英

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

[英]How do I change pattern from one array to another and then back

我在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;
}

最简单的解决方法是分离出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];
      }

现场演示


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

是否可以用一些未使用的值(例如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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM