You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有序数组去重代码优化咨询:寻求Clean Code改进建议

有序数组去重代码的Clean Code优化建议

先明确原代码的核心问题,再给出符合Clean Code规范的优化实现:

原代码关键问题

  • 未定义行为:last_item初始化为未初始化的result[0],会导致程序行为不可预测(可能读取随机值,错误过滤第一个元素)。
  • 结果数组处理错误:直接用原数组索引赋值result[i],会让结果数组留下大量未初始化空位,无法得到真正的去重后数组。
  • 返回值不符合规范:main函数正常结束应返回0,返回1会被视为程序执行失败。
  • 命名模糊:last_item、arr_size等变量表意不够精准,降低代码可读性。
  • 数组长度计算可读性差:*(&arr + 1) - arr依赖指针运算细节,不如sizeof(arr)/sizeof(arr[0])直观。
  • 逻辑未模块化:去重逻辑和主流程混在一起,无法在其他场景复用。

优化后的Clean Code实现

#include <stdio.h>

// 对有序int数组去重,返回去重后元素的数量
int remove_duplicates(const int arr[], int arr_len, int result[]) {
    if (arr_len == 0) {
        return 0;
    }

    int unique_count = 1;
    result[0] = arr[0];

    for (int i = 1; i < arr_len; ++i) {
        // 仅当当前元素与最后一个唯一元素不同时,加入结果数组
        if (arr[i] != result[unique_count - 1]) {
            result[unique_count] = arr[i];
            unique_count++;
        }
    }

    return unique_count;
}

int main() {
    const int original_arr[] = {1,2,2,2,3,4,4,4,5,6,7,7,7,8,8};
    const int original_len = sizeof(original_arr) / sizeof(original_arr[0]);
    
    printf("原数组长度:%d\n", original_len);

    // 结果数组最大长度不会超过原数组
    int unique_arr[original_len];
    int unique_len = remove_duplicates(original_arr, original_len, unique_arr);

    printf("去重后数组元素:");
    for (int i = 0; i < unique_len; ++i) {
        printf("%d ", unique_arr[i]);
    }
    printf("\n去重后长度:%d\n", unique_len);

    return 0;
}

优化点说明

  • 模块化设计:将去重逻辑封装为独立函数,参数明确、返回值清晰,方便复用和单独测试。
  • 精准命名:original_arr、unique_count等变量名直接表达用途,无需额外注释就能理解代码意图。
  • 规避未定义行为:初始化结果数组第一个元素,通过unique_count跟踪有效索引,确保所有操作的内存都是合法初始化的。
  • 符合C标准:main函数返回0表示正常退出,用const修饰只读的原数组,增强代码安全性。
  • 可读性提升:用直观的方式计算数组长度,循环逻辑添加简洁注释,降低理解成本。
  • 边界处理:增加空数组的判断逻辑,避免极端场景下的错误。

内容的提问来源于stack exchange,提问作者Paroz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:55:20