gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:47 29 4
gpt4 key购买 nike

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

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

我想要的是改变数组的顺序通过将数组分成动态大小的 block ,比如 3(可以是其他大小)。

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

然后使用这些值将数组分成大约 3 个数字的 block :

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

然后从第一个 block 中获取第一个值,从下一个 block 中获取下一个值,例如:

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

然后跳两个 block 并添加下一部分:

6,9, 7, 8

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

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

当最后一个 block 有时可能不包含一组完整的数字时,我如何用算法解决这个问题?

然后我如何创建一个算法来将结果数组反转回原来的样子?

不,这不是作业,我要用它来随机播放一个声音文件,让其他人很难复制文件并随心所欲地使用它。

编辑:这是我最后一次被卡住的测试尝试:

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];
}

Live demo .


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

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

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

这会给我们一个输出:

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

转换回来会容易得多。

或者,如果您受困于自己的结构,或者无论如何都想挑战代码:

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

关于c++ - 如何将模式从一个数组更改为另一个数组然后再返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308451/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com