题目
给你一个长度为 n
的整数数组 nums
。请你构建一个长度为 2n
的答案数组 ans
,数组下标 从 0 开始计数 ,对于所有 0 <= i < n
的 i
,满足下述所有要求:
ans[i] == nums[i]
ans[i + n] == nums[i]
具体而言,ans
由两个 nums
数组 串联 形成。
返回数组 ans
。
示例 1:
输入:nums = [1,2,1] 输出:[1,2,1,1,2,1] 解释:数组 ans 按下述方式形成: - ans = [nums[0],nums[1],nums[2],nums[0],nums[1],nums[2]] - ans = [1,2,1,1,2,1]
示例 2:
输入:nums = [1,3,2,1] 输出:[1,3,2,1,1,3,2,1] 解释:数组 ans 按下述方式形成: - ans = [nums[0],nums[1],nums[2],nums[3],nums[0],nums[1],nums[2],nums[3]] - ans = [1,3,2,1,1,3,2,1]
提示:
n == nums.length
1 <= n <= 1000
1 <= nums[i] <= 1000
代码
这边我把main方法实现出来了 , 解题思路可以看我的注释
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
// 定义一个名为 getConcatenation 的函数,它接受一个整数指针数组(nums)和一个表示 nums 长度的整数(numsSize),并返回一个整数指针以及通过引用传递的整数变量(returnSize)以记录新数组的长度。
int* getConcatenation(int* nums, int numsSize, int* returnSize) {
int* p = NULL;
// 动态分配内存以存储 nums 数组两倍长度的新数组
p = (int*)malloc(sizeof(int) * numsSize * 2); // 开辟两个数组的空间
// 检查内存是否成功分配
if (p != NULL) {
// 遍历输入数组 nums
for (int i = 0; i < numsSize; i++) {
// 将 nums 数组中的第 i 个元素复制到新数组 p 的对应位置
*(p + i) = nums[i];
// 再将 nums 数组中的第 i 个元素复制到新数组 p 中 numsSize 位置后开始的位置,实现数组拼接
*(p + numsSize + i) = nums[i];
}
}
// 设置返回值 returnSize 为新数组的长度,即原数组长度的两倍,方便在main函数中遍历
*returnSize = numsSize * 2;
// 返回指向新分配内存空间的指针
return p;
}
int main() {
int arr[] = { 1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int count;
int* ret = getConcatenation(arr,sz,&count);
for (int i = 0; i < count; ++i)
{
printf("%d ",ret[i]);
}
printf("\n");
free(ret);
return 0;
}
函数实现解析
动态分配内存:使用
malloc
函数为合并数组分配内存。由于要合并的是原始数组及其副本,因此所需空间是原数组长度的两倍。分配完成后,将新分配内存的地址赋给指针p
。检查内存分配:如果
p
不为空,说明内存分配成功,可以继续进行数组复制操作。否则,应处理内存分配失败的情况(此处省略,实际编程中应考虑异常处理)。复制元素:使用
for
循环遍历nums
数组。对于数组中的每个元素,将其复制到新数组p
的相应位置,然后再次复制到新数组中numsSize
位置之后的相同偏移处,从而实现数组的拼接。设置返回值:将
returnSize
指向的整数值设置为新数组的长度,即原数组长度的两倍。这便于在main
函数或其他调用者中正确遍历返回的合并数组。返回指针:返回指向新分配内存空间的指针
p
,供调用者使用。
在这个示例中,我们创建了一个整数数组arr
,计算其大小sz
,然后调用getConcatenation
函数。函数返回的合并数组指针存储在ret
中,其长度保存在count
中。接着,我们遍历返回的合并数组并打印其元素,最后释放ret
所指向的内存。运行此程序,输出结果应为: