C:统计数组中不重复数组个数

本文介绍了一种方法来统计已按照userId升序排列的ArrayList中不同userId的对象数量,通过遍历比较实现去重。
C:
#include <stdio.h>

#define SIZE 10

int main() {
   int arr[SIZE] = {1,2,45,2,1,8,-3,0,2,4};
   int tmp[SIZE];
   int count = 0;
   int diff;
   int i, j;

   for (i=0; i<SIZE; i++) {
      diff = 1;
      for (j=0; j<count; j++) {
         if (arr[i] == tmp[j]) {
            diff = 0;
            break;  
         }       
      }
      if (diff)
         tmp[count++] = arr[i]; 
   }

   for (i=0; i<count; i++) 
      printf("%d ", tmp[i]);
   printf("\ncount: %d\n", count); 
}


在项目开发过程中遇到需要统计ArrayList中 对象的userId不相同的 对象个数,ArrayList中的数据在查询时,已按照userId 升序排列,所以仿照上述C的写法如下:

int count = 0;
        boolean flag = true;
        List<UserLotteryVO> listVO = new ArrayList<UserLotteryVO>();
        List<UserLotteryVO> tempListVO= new ArrayList<UserLotteryVO>();
        List<UserLottery> listEntity = userLotteryDao.SearchUserLotteryByDrawNum(drawNum);
        for(UserLottery ul : listEntity ) {
            listVO.add(this.convertToUserLotteryHistoryVO(ul));
        }
        for(UserLotteryVO vo : listVO) {
            flag = true;
            for(int i = 0; i < count; i++) {
                if(i >= count) {
                    break;
                }
                if(tempListVO.size() > 0 && (vo.getUserId() == tempListVO.get(i).getUserId())) {
                    flag = false;
                    break;
                }
            }
            if(flag) {
                tempListVO.add(vo);
                count++;
            }
        }
        return count;





在C语言中,求数组重复元素数量可以通过以下几种常见方法实现: ### 方法一:双重循环去重计数 这种方法通过双重循环遍历数组,将重复的元素标记或移除,最后统计重复元素的数量。以下是示例代码: ```c #include <stdio.h> int main() { int arr[] = {1, 2, 3, 1, 2, 3, 7, 3, 1, 9, 5, 6, 4}; int len = sizeof(arr) / sizeof(int); int i, j, k; int uniqueCount = len; for (i = 0; i < len; i++) { for (j = i + 1; j < len; j++) { if (arr[i] == arr[j]) { for (k = j; k < len - 1; k++) { arr[k] = arr[k + 1]; } len--; j--; uniqueCount--; } } } printf("重复元素的数量: %d\n", uniqueCount); return 0; } ``` 此方法的核心思想是,外层循环遍历数组中的每个元素,内层循环检查后续元素是否与当前元素重复。若发现重复元素,则将其移除,并更新数组长度和重复元素的数量。该方法的时间复杂度为$O(n^2)$,因为使用了双重循环。 ### 方法二:标记重复元素 这种方法通过标记重复元素,最后统计未被标记的元素数量。以下是示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 int main() { int arr[] = {1, 2, 3, 1, 2, 3, 7, 3, 1, 9, 5, 6, 4}; int len = sizeof(arr) / sizeof(int); int i, j; int isDuplicate[MAX_SIZE] = {0}; int uniqueCount = 0; for (i = 0; i < len; i++) { if (!isDuplicate[i]) { for (j = i + 1; j < len; j++) { if (arr[i] == arr[j]) { isDuplicate[j] = 1; } } uniqueCount++; } } printf("重复元素的数量: %d\n", uniqueCount); return 0; } ``` 此方法使用一个额外的数组`isDuplicate`来标记重复元素。外层循环遍历数组中的每个元素,若该元素未被标记,则内层循环检查后续元素是否与当前元素重复。若发现重复元素,则标记该元素。最后,统计未被标记的元素数量,即为重复元素的数量。该方法的时间复杂度同样为$O(n^2)$。 ### 方法三:排序后统计 先对数组进行排序,然后遍历排序后的数组统计重复元素的数量。以下是示例代码: ```c #include <stdio.h> #include <stdlib.h> // 比较函数,用于qsort int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int arr[] = {1, 2, 3, 1, 2, 3, 7, 3, 1, 9, 5, 6, 4}; int len = sizeof(arr) / sizeof(int); int i; int uniqueCount = 1; // 对数组进行排序 qsort(arr, len, sizeof(int), compare); // 统计重复元素的数量 for (i = 1; i < len; i++) { if (arr[i] != arr[i - 1]) { uniqueCount++; } } printf("重复元素的数量: %d\n", uniqueCount); return 0; } ``` 此方法先使用`qsort`函数对数组进行排序,使相同元素相邻。然后遍历排序后的数组,若当前元素与前一个元素同,则重复元素的数量加1。该方法的时间复杂度主要取决于排序算法,`qsort`的平均时间复杂度为$O(n log n)$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值