You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:54:58