如何用c语言实现用索引数组替换数组中元素的算法?

3gtaxfhh  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(101)

我有两个数组:

int mainArr[10] = {111, 222, 333, 444, 555, 666, 777, 888, 999, 3000};
int indexArray[10] = {6, 2, 9, 0, 1, 3, 7, 4, 5, 8};

它必须像这样工作:indexArray替换mainArr中的元素。第六个元素替换零元素,第二个元素替换第一个元素,依此类推。
最后应该是这样的:

777 333 3000 111 222 444 888 555 666 999 - mainArr
^    ^    ^   ^   ^   ^   ^   ^   ^   ^
6    2    9   0   1   3   7   4   5   8 - indexArray

我有一段代码来理解正在发生的事情:

int replaceByIndex (int startArray[], int customIndexes[]);

int main ()
{
    int *result;
    int mainArr[10] = {111, 222, 333, 444, 555, 666, 777, 888, 999, 3000};
    int indexArray[10] = {6, 2, 9, 0, 1, 3, 7, 4, 5, 8};
    result = replaceByIndex(mainArr, indexArray);
    for (int i = 0; i < 10; i++) {
        printf("%d\n", result[i]);
    }
    return 0;
}

int replaceByIndex (int startArray[], int customIndexes[]) {
    for (int i = 0; i < 10; i++) {
        startArray[i] = customIndexes[i];
    }
    return startArray;
}

我只是做了一个替换数组元素的算法,但这不是我需要的。

fnx2tebb

fnx2tebb1#

int *replaceByIndex(int *startArray, int startArray_size,
                    int *customIndex, int customIndex_size) {
    int *tmp = malloc(sizeof(int) * startArray_size);
    for (int i = 0; i < customIndex_size; ++i) {
        tmp[i] = startArray[customIndex[i]];
    }
    return tmp; // must be freed after use
}

这是最简单的方法来归档你想要的东西。你想要的解决方案的问题是,自定义索引是对数组中旧位置的引用,而不是你正在构建的新位置,所以你要么以其他方式格式化customIndex数组,要么创建一个新数组。

gjmwrych

gjmwrych2#

你想要这样的东西:

#include <stdio.h>

int *replaceByIndex(int startArray[], int customIndexes[], int destinationarray[])
{
  for (int i = 0; i < 10; i++)
    destinationarray[i] = startArray[customIndexes[i]];

  return destinationarray;
}

int main()
{
  int* result;
  int mainArr[10] = { 111, 222, 333, 444, 555, 666, 777, 888, 999, 3000 };
  int indexArray[10] = { 6, 2, 9, 0, 1, 3, 7, 4, 5, 8 };
  int newarray[10]; // will contain the array with swapped values

  result = replaceByIndex(mainArr, indexArray, newarray);

  for (int i = 0; i < 10; i++) {
    printf("%d\n", result[i]);
  }
  return 0;
}

仍有改进的余地。例如:

  • 简单:数组大小在replaceByIndex中被硬编码为10,你应该用一个参数来替换它。
  • 简单:也许你应该检查customIndexes中没有一个索引超过数组大小。
  • 不那么容易:您可以在没有第3个阵列的情况下就地进行更换

我把这些作为练习留给你。

相关问题