我如何改变模式从一个数组到另一个,然后回来
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
。