如何用C语言实现通过索引数组替换主数组元素的算法
问题:通过索引数组重排目标数组元素
给定两个数组:
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};
需求:将mainArr的第i个元素替换为原始mainArr[indexArray[i]]的值,最终得到结果:
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; }
错误点:
- 函数内直接把
startArray元素赋值为索引数组的数值,而非原数组对应索引的元素 - 即使修正赋值逻辑,直接修改原数组会导致后续取值使用已修改的值(而非原始值),最终结果错误
正确实现方案
方案一:原地修改原数组(需保存原始值副本)
通过临时数组保存原数组的原始值,避免修改后影响后续取值:
#include <stdio.h> #include <string.h> int* replaceByIndex(int startArray[], int customIndexes[], int length); int main() { 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* result = replaceByIndex(mainArr, indexArray, 10); for (int i = 0; i < 10; i++) { printf("%d ", result[i]); } printf("\n"); return 0; } int* replaceByIndex(int startArray[], int customIndexes[], int length) { // 创建临时数组存储原始值 int temp[length]; memcpy(temp, startArray, sizeof(int) * length); for (int i = 0; i < length; i++) { // 用原始值赋值,避免原数组修改后的数据污染 startArray[i] = temp[customIndexes[i]]; } return startArray; }
方案二:创建新数组存储结果(不修改原数组)
动态分配内存生成结果数组,保留原数组不变:
#include <stdio.h> #include <stdlib.h> int* replaceByIndex(int startArray[], int customIndexes[], int length); int main() { 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* result = replaceByIndex(mainArr, indexArray, 10); if (result) { for (int i = 0; i < 10; i++) { printf("%d ", result[i]); } printf("\n"); free(result); // 释放动态分配的内存 } return 0; } int* replaceByIndex(int startArray[], int customIndexes[], int length) { // 分配内存存储结果,失败则返回NULL int* result = (int*)malloc(sizeof(int) * length); if (!result) return NULL; for (int i = 0; i < length; i++) { result[i] = startArray[customIndexes[i]]; } return result; }
内容的提问来源于stack exchange,提问作者emblox
相关产品推荐
相关产品推荐

