1920. 基于排列构建数组

1920. 基于排列构建数组
给你一个 从 0 开始的排列 nums(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans 。从 0 开始的排列 nums 是一个由 0 到 nums.length - 1(0 和 nums.length - 1 也包含在内)的不同整数组成的数组。
示例 1:输入:nums = [0,2,1,5,3,4],输出:[0,1,2,4,5,3],
解释:数组ans构建如下:ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]= [nums[0], nums[2], nums[1], nums[5], nums[3], nums[4]]= [0,1,2,4,5,3]
示例 2:输入:nums = [5,0,1,2,3,4],输出:[4,5,0,1,2,3],解释:数组 ans 构建如下:
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]= [nums[5], nums[0], nums[1], nums[2], nums[3], nums[4]]=[4,5,0,1,2,3]
提示:1 <= nums.length <= 1000,0 <= nums[i] < nums.length,nums 中的元素 互不相同

#include <stdio.h>
#include <stdlib.h>
int* buildArray(int* nums, int numsSize, int* returnSize) {
    int* ans = (int*)malloc(numsSize * sizeof(int));
    *returnSize = numsSize;
    for (int i = 0; i < numsSize; i++) {
        ans[i] = nums[nums[i]];
    }
    return ans;
}
int main() {
    int nums[] = {0, 2, 1, 5, 3, 4};
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    int returnSize;
    int* ans = buildArray(nums, numsSize, &returnSize);
    printf("构建的数组:");
    for (int i = 0; i < returnSize; i++) {
        printf("%d ", ans[i]);
    }
    printf("\n");
    free(ans);
    return 0;
}
在上述代码中,我们定义了 `buildArray` 函数来构建基于排列的数组。该函数接受一个nums数组和其大小 `numsSize` 作为输入,并返回构建好的数组ans。我们还通过 `returnSize` 指针参数返回构建好的数组的大小。
在buildArray函数中,我们使用动态内存分配来创建一个与nums数组大小相同的数组 `ans`。然后,我们使用for循环遍历 `nums` 数组,根据排列规则将 `nums[nums[i]]` 的值赋给 ans[i]。
在 `main` 函数中,我们定义了一个示例数组 `nums`,并调用 `buildArray` 函数来构建基于排列的数组。最后,我们打印构建好的数组。
运行上述代码将输出以下结果:
构建的数组:0 1 2 4 5 3 
该代码可以处理输入数组大小为 1 到 1000 的情况,并且假设输入的排列数组 `nums` 中的元素互不相同。

-------------------------------------------
当然,请看下面的代码解释:
#include <stdio.h>
#include <stdlib.h>
这两行是引入标准输入输出库和标准库,以便使用 `printf` 和 `malloc` 函数。

int* buildArray(int* nums, int numsSize, int* returnSize) {
这是函数的定义,`buildArray` 函数接受一个整数指针 `nums`,一个整数 `numsSize`,和一个整数指针 `returnSize` 作为参数,返回一个整数指针。
    int* ans = (int*)malloc(numsSize * sizeof(int));
    *returnSize = numsSize;
这两行用于动态分配内存,创建一个大小为 `numsSize` 的整数数组 `ans`,并将 `numsSize` 的值赋给 `returnSize` 指针所指向的变量。
    for (int i = 0; i < numsSize; i++) {
        ans[i] = nums[nums[i]];
    }
这是一个 `for` 循环,用于遍历 `nums` 数组。在每次循环中,将 `nums[i]` 作为索引,从 `nums` 数组中取出对应的值,再将该值作为索引,从 `nums` 数组中取出对应的值,并将其赋给 `ans[i]`。
    return ans;
}
这行代码表示函数结束并返回 `ans` 数组的指针。
int main() {
    int nums[] = {0, 2, 1, 5, 3, 4};
    int numsSize = sizeof(nums) / sizeof(nums[0]);
这是 `main` 函数的定义,其中定义了一个示例数组 `nums`,并通过计算数组元素个数的方式得到数组的大小 `numsSize`。
    int returnSize;
    int* ans = buildArray(nums, numsSize, &returnSize);
这两行定义了一个整数变量 `returnSize` 和一个整数指针 `ans`,并调用 `buildArray` 函数来构建基于排列的数组,将返回的数组指针赋给 `ans`,并通过 `&returnSize` 将 `returnSize` 的地址传递给 `buildArray` 函数。
    printf("构建的数组:");
    for (int i = 0; i < returnSize; i++) {
        printf("%d ", ans[i]);
    }
    printf("\n");
这是一个 `for` 循环,用于遍历 `ans` 数组并打印其中的元素。
    free(ans);
这行代码用于释放通过 `malloc` 函数分配的内存。

    return 0;
}
这行代码表示 `main` 函数结束并返回 0,表示程序正常运行结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值