我在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;
}
答案 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];
}
当尝试将数据转换回来时,数组的末尾会带来更多问题。
是否可以只使用一些未使用的值(比如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
。