我如何改变模式从一个数组到另一个,然后回来

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

本文关键字:数组 一个 回来 然后 另一个 何改变 改变 模式      更新时间:2023-10-16

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

相关文章: