C语言每日一练(5)将整型数组中数值相等的元素只保留一个,其他的删除,返回新数组的长度

博客给出一个C语言题目,要求处理有序整形数组,将相同数字只保留一个并删除其他。已知数组已从小到大排列,解题方法是遍历数组,判断当前元素与新数组最后一个元素是否相等,不相等则赋值给新数组并增加长度,还给出了相应代码。

题目:将整形数组中数字相同的数字只保留一个,其他的都删除,已知数组元素已经按从小到大的顺序排列。

    例如[2,2,2,3,3,4,5,5,6,6,7],处理完成之后的数字应该为[2,3,4,5,6,7],函数的返回值为新数组的长度。

题目很简单,因为已经按从小到大排列了,所以就是遍历数组,判断数组的当前元素是不是等于新数组的最后一个元素,如果不相等,就把值赋给新数组,新数组长度+1

代码如下:

/*
    题目:将整形数组中数字相同的数字只保留一个,其他的都删除
    已知数组元素已经按从小到大的顺序排列。
    例如[2,2,2,3,3,4,5,5,6,6,7],处理完成之后的数字应该为
    [2,3,4,5,6,7],函数的返回值为新数组的长度
*/

#include <stdio.h>

static int del_equal_value(int a[], int n)
{
    int i,j=0;
    if(n <= 0){         //判断输入的数组长度是否正确
        return 0;
    }else{
        for(i = 1; i<n; i++){
            if(a[j] != a[i]){   //判断数组遍历的当前值和新数组的最后一个值是否相等
                a[j+1] = a[i];  //如果不等,将值赋给新数组,新数组数量+1
                j++;
            }
        }
    }
    return j+1;         //数组的下标为j,所以元素个数为j+1;
}


int main(void)
{
    int a[11] = {2,2,2,3,3,4,5,5,6,6,7};
    int n = 11;
    int i;
    n = del_equal_value(a,n);
    if(n){
        for(i = 0; i<n; i++){
            printf("%d ",a[i]);
        }
        printf("\r\n");
    }else{
        printf("输入的数组长度有误\r\n");
    }
    
    return 0;
}

 

### C语言实现数组去重和排序 以下是基于C语言一个示例代码,用于处理长度不超过3的整型数组,完成去重和排序的功能。此代码利用哈希表的思想来统计元素出现次数,并按照指定规则进行排序。 #### 去重与排序的核心逻辑 为了实现数组去重和排序功能,程序会先遍历输入数组中的每一个元素,使用辅助结构存储每个元素及其对应的计数信息。随后根据这些数据重新构建一个新的有序数组[^4]。 ```c #include <stdio.h> #include <stdlib.h> // 定义最大数组长度 #define MAX_LEN 3 typedef struct { int value; int count; } ElementCount; void removeDuplicatesAndSort(int arr[], int length, int result[]) { // 辅助数组保存原始数组中各元素的频率 ElementCount elements[MAX_LEN]; int uniqueElements = 0; for (int i = 0; i < length; ++i) { bool found = false; for (int j = 0; j < uniqueElements; ++j) { if (elements[j].value == arr[i]) { elements[j].count++; found = true; break; } } if (!found && uniqueElements < MAX_LEN) { elements[uniqueElements].value = arr[i]; elements[uniqueElements].count = 1; uniqueElements++; } } // 对唯一元素按出现次数降序排列,如果次数相等则保持原顺序 for (int i = 0; i < uniqueElements - 1; ++i) { for (int j = i + 1; j < uniqueElements; ++j) { if (elements[i].count < elements[j].count) { ElementCount temp = elements[i]; elements[i] = elements[j]; elements[j] = temp; } } } // 将结果写入result数组 for (int i = 0; i < uniqueElements; ++i) { result[i] = elements[i].value; } } int main() { int inputArray[] = {2, 3, 2}; int length = sizeof(inputArray) / sizeof(inputArray[0]); int outputArray[length]; removeDuplicatesAndSort(inputArray, length, outputArray); printf("After removing duplicates and sorting:\n"); for (int i = 0; i < length; ++i) { if (outputArray[i] != 0) { printf("%d ", outputArray[i]); } } return 0; } ``` 以上代码展示了如何通过简单的嵌套循环以及自定义的数据结构 `ElementCount` 来管理重复项并对其进行排序[^4]。 ### 注意事项 - 输入数组的最大长度被设定为常量 `MAX_LEN=3`。 - 结果数组保留唯一的数值,并依据其在初始列表里的出现频率从高至低排序;当两个值具有相同的频率时,则维持它们原本的位置关系。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值