1/14-C语言重排数组

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:输出数组长度的指针

实现步骤

参数校验

检查输入指针有效性及参数合法性。若numsreturnSize为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),需要额外分配与输入数组等长的内存空间。

边界条件处理

  • 空指针输入
  • 负数分组大小
  • 数组长度不匹配
  • 内存分配失败
    所有异常情况均通过提前返回处理,避免程序崩溃。
复制代码
相关推荐
宵时待雨几秒前
优选算法专题1:双指针
数据结构·c++·笔记·算法·leetcode
zsc_1182 分钟前
pvz3解码小游戏求解算法
算法
汀、人工智能4 分钟前
[特殊字符] 第107课:LRU缓存(最后一课[特殊字符])
数据结构·算法·链表·数据库架构·哈希表·lru缓存
数据知道4 分钟前
claw-code 源码分析:大型移植的测试哲学——如何用 unittest 门禁守住「诚实未完成」的口碑?
开发语言·python·ai·claude code·claw code
数据知道9 分钟前
claw-code 源码分析:结构化输出与重试——`structured_output` 一类开关如何改变「可解析性」与失败语义?
算法·ai·claude code·claw code
tankeven10 分钟前
HJ172 小红的矩阵染色
c++·算法
小堃学编程13 分钟前
【项目实战】基于protobuf的发布订阅式消息队列(2)—— 线程池
java·开发语言
2301_8227032014 分钟前
Flutter 框架跨平台鸿蒙开发 - 智能植物生长记录应用
算法·flutter·华为·harmonyos·鸿蒙
每日任务(希望进OD版)19 分钟前
线性DP、区间DP
开发语言·数据结构·c++·算法·动态规划
怨言.20 分钟前
Java内部类详解:从基础概念到实战应用(附案例)
java·开发语言