【问题标题】:How to make permutations in an array?如何在数组中进行排列?
【发布时间】:2019-10-13 17:20:58
【问题描述】:

我是 C 新手,我正在尝试编写一个函数,该函数将在数组中进行排列,给定一个具有每个元素的新位置的数组。

我想要的一个例子:

int newPositions[] = {3,1,5,2,4};
int arr[] = {20,30,-1,9,1};
>> {-1,20,1,30,9}

我来自 Java,所以我有我们想尝试的基本函数,但是当我看到我无法在 C 中返回数组时,我很惊讶,我正在尝试找到在不使用太多内存的情况下做到这一点的最佳方法。我想过复制数组,但是还有其他解决方案吗?

谢谢

【问题讨论】:

  • 将结果数组作为指向其第一个元素的指针传递。
  • 在 SO 上要求“最佳方式”通常是不好的形式 - 它是主观的,因此是意见或目标限制的问题。只需询问“如何”,您将获得许多解决方案,希望得到有用的解释,以便您评估优势,其他人会投票和评论,您的“最佳”解决方案将变得显而易见。
  • 请注意,C 数组的索引是从零开始的,所以{2,0,4,1,3} 会使得实现稍微简单一些。
  • 您正在询问实现该功能的最糟糕的方式,但在正文中解释您的 problem 正在返回一个数组 - 这是一个不同且更普遍的问题。您最好询问如何更通用地解决该问题;否则你可能会得到很多聪明的算法,但仍然不知道如何解决数组不是 C 中的一流数据类型的问题。

标签: c arrays permutation


【解决方案1】:

这可能是这样的:

#include <string.h>

void permutate(int** array, int* newPositions, int count)
{
    int* arrayCopy = malloc(sizeof(int) * count);
    memcpy(arrayCopy, array, sizeof(int) * count);

    for (int i = 0; i < count; i++)
    {
        array[i] = arrayCopy[newPositions[i] - 1];
    }

    free(arrayCopy);
}

请注意,C 中的数组不知道它们的长度(这就是必须传递 count 的原因),因此如果两个数组和/或 size 之间不匹配,您的程序将会出现意外或崩溃。

关于C中的数组和指针有很多细节需要了解。请好好看看this chapter of the famous C-FAQ

【讨论】:

  • 从问题中的示例newPositions[] 来看,循环中的表达式需要是:array[i] = arrayCopy[newPositions[i] - 1];,因为“位置”的索引是从 1 而不是零。也就是说,最好将newPositions[] 中的索引从零更改为索引,并保持原样。
猜你喜欢
  • 1970-01-01
  • 2011-12-09
  • 2021-09-21
  • 2015-01-22
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2011-11-18
相关资源
最近更新 更多