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 @ 2024-05-10 14:40  你若愿意,我一定去  阅读(2)  评论(0编辑  收藏  举报
23423423423