c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* shuffle(int* nums, int numsSize, int n, int* returnSize) {
// 补充:入参合法性校验(处理所有非法输入场景)
if (nums == NULL || returnSize == NULL || n < 0 || numsSize != 2 * n) {
// 避免对NULL指针解引用,仅当returnSize有效时重置为0
if (returnSize != NULL) {
*returnSize = 0;
}
return NULL;
}
//返回数组和原数组的长度一致。
*returnSize=numsSize;
int* result=(int*)malloc(*returnSize*sizeof(int));
if(result==NULL){
*returnSize=0;
return NULL;
}
//4. 按规则填充新数组:[x1,y1,x2,y2,...,xn,yn]
//按规则填充新数组:通过循环遍历0~n-1,每次循环同时处理xi和yi:
//xi对应原数组索引i,填充到新数组索引2i(偶数位)。
//yi对应原数组索引i+n(后n个元素的起始偏移为n),填充到新数组索引2i+1(奇数位)。
for(int i=0;i<n;i++){
// 填充xi:新数组偶数索引(0,2,4...)
result[2*i]=nums[i];
// 填充yi:也就是每个起始的后面的对应的yn 新数组奇数索引(1,3,5...)
result[2*i+1]=nums[i+n];
}
// 5. 返回动态分配的结果数组
return result;
}
c
int main() {
int nums[] = {1,3,5,7,9,11};
int returnSize;
int* result = shuffle(nums, 6, 3, &returnSize);
// 使用result数组...
free(result); // 必须释放内存
}
代码功能分析
该函数实现数组重排功能,将输入数组按特定规则重新排列。输入数组包含2n个元素,前n个为x组,后n个为y组,输出数组格式为[x1,y1,x2,y2,...,xn,yn]。
参数说明
nums:输入数组指针numsSize:输入数组长度n:分组大小(前n和后n)returnSize:输出数组长度的指针
实现步骤
参数校验
检查输入指针有效性及参数合法性。若nums或returnSize为NULL,或n为负数,或numsSize不等于2n,则设置returnSize为0并返回NULL。
内存分配
为结果数组分配内存空间,大小为numsSize。若分配失败,设置returnSize为0并返回NULL。
数组重排 ------(核心步骤)
通过循环将原数组元素按规则填充到新数组:
- 原数组前n个元素 (
nums[i])放入新数组偶数索引 (2*i) - 原数组后n个元素 (
nums[i+n])放入新数组奇数索引 (2*i+1)
结果返回
返回动态分配的结果数组指针,调用者需负责释放内存。
时间复杂度
该算法时间复杂度为O(n),仅需一次遍历即可完成数组重排。
空间复杂度为O(n),需要额外分配与输入数组等长的内存空间。
边界条件处理
- 空指针输入
- 负数分组大小
- 数组长度不匹配
- 内存分配失败
所有异常情况均通过提前返回处理,避免程序崩溃。