234234234

c语言 复杂度为O(n)的有序数字字符的去重

 

复制代码
#include <stdio.h>

int main() {
    // 有序列表的去重 
    int arr[] = {1,2,2,3,3,3,5,6,7,7,7,7,8,8,9,9,9};
    int len = sizeof(arr)/4;
    int mark[len] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    int k = 0;
    // 打印数组 
    printf("原始数组: ") ;
    for(int i = 0; i < len; i++) {
        printf("%d ",  arr[i]);
    }
    // 统计重复的数字,用k进行累加 
    // 也就是重复数字后面的不重复的数字应该向前移动多少位
    // 并保存到mark数组中 
    for(int i = 0; i < len; i++) {
        if (arr[i] == arr[i+1]) {
            k++;
        } else {
            mark[i] = k;
        }
    }
    // 开始去重 
    for(int i = 0; i < len; i++) {
        arr[i - mark[i]] = arr[i]; 
    }
    // 打印共有多少个重复数字 
    printf("\n");
    printf("重复数字k: %d个",  k);
    printf("\n",  k);
    printf("mark: ") ;
    // 打印mark 
    for(int i = 0; i < len; i++) {
        printf("%d ",  mark[i]);
    }
    printf("\n");
    // 打印已经去重的有序列表 
    printf("已去重的数组: ") ;
    for(int i = 0; i < len-k; i++) {
        printf("%d ",  arr[i]);
    }
    return 0;
} 
复制代码

 

posted @   你若愿意,我一定去  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
23423423423
点击右上角即可分享
微信分享提示