C语言实现数组串联

题目

给你一个长度为 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;
}

函数实现解析

  1. 动态分配内存:使用malloc函数为合并数组分配内存。由于要合并的是原始数组及其副本,因此所需空间是原数组长度的两倍。分配完成后,将新分配内存的地址赋给指针p

  2. 检查内存分配:如果p不为空,说明内存分配成功,可以继续进行数组复制操作。否则,应处理内存分配失败的情况(此处省略,实际编程中应考虑异常处理)。

  3. 复制元素:使用for循环遍历nums数组。对于数组中的每个元素,将其复制到新数组p的相应位置,然后再次复制到新数组中numsSize位置之后的相同偏移处,从而实现数组的拼接。

  4. 设置返回值:将returnSize指向的整数值设置为新数组的长度,即原数组长度的两倍。这便于在main函数或其他调用者中正确遍历返回的合并数组。

  5. 返回指针:返回指向新分配内存空间的指针p,供调用者使用。

在这个示例中,我们创建了一个整数数组arr,计算其大小sz,然后调用getConcatenation函数。函数返回的合并数组指针存储在ret中,其长度保存在count中。接着,我们遍历返回的合并数组并打印其元素,最后释放ret所指向的内存。运行此程序,输出结果应为:

运行结果

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普通young man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值