给定一个集合,查找集合中一共多多少种不同的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定一个集合,查找集合中一共多多少种不同的元素相关的知识,希望对你有一定的参考价值。

第一行输入一个n,表示集合元素的个数
接下来输入n的整数
输入集合中一共有多少个不同的值

尽量使用高效算法

/*此题的时间复杂度为O(MAX),即一层for循环,但是却相当耗费空间,故而MAX的值必须在一定的范围内,如果是追求时间效率的话可以考虑*/
/*此题算法就是用两个数组分别来记录正负数出现的次数;如下:
a[i] 表示输入的n个数据
b[i] 表示整数i出现的次数,(因为a[i]作为b的下标)
c[i] 表示整数-i出现的次数,(因为 a[i]为负数时,将其绝对值作为c的下标)
最后凡是b和c中的元素 不为0 就表示有一种不同的数据,最后通过一层for循环统计出结构
因此 输入的n个元素 每个数据大小都不能超过MAX的值,否则无法记录*/

#include <stdio.h>
#include <math.h> //求绝对值函数abs()所在的库需要包含的头文件
#define MAX 10000 //假定输入的数据不大于100000
int main()

int i,n,count=0;//count 表示存在多少种不同的数据
int a[MAX]; //存放输入的n个数据元素
int b[MAX] = 0; //用来记录输入的每个数据出现的次数
int c[MAX] = 0; //用来记录负数出现的次数
printf("请输入元素个数:");
scanf("%d",&n);
printf("请输入%d个数据:\n",n);
for(i=0; i<n; i++)

scanf("%d",&a[i]);

for(i=0; i<n; i++)

if(a[i]>0)

b[a[i]]++; //这里将a[i]的值作为b的下标,如输入的数据元素 a[0] = 10;则将 b[10] 自增1,以此表示数字10出现了一次

else

c[abs(a[i])]++; //如果a[i]是负数,对其求绝对值,然后将其绝对值作为c的下标;这里c[10]就表示 数字 -10出现的次数


for(i=0;i<MAX;i++)

if(b[i] != 0) //当b[i]不等于0 ,就表示整数i出现了b[i]次;则不同数目元素加1

count++;

if(c[i] != 0) //当c[i]不等于0,就表示整数 -i 出现了c[i]次;则不同元素数目加1

count++;


printf("输入的数据元素中共有%d种不同的元素.\n",count);
return 0;

//测试结果
请输入元素个数:10
请输入10个数据:
1 1 2 2 3 3 4 4 5 5
输入的数据元素中共有5种不同的元素.
Press any key to continue
参考技术A 楼上其实用的是hash的思想,不过人为加了很多条件哦,呵呵
我来给个基于hash的简单实现吧~~
/* 程序思路:
* 将输入的n个数字散列到哈希表中,建立哈希表的过程中,
* 查找有没有重复数字,如果有,则总个数值不变
* 否则总个数+1
* */
#include <stdio.h>
#include <stdlib.h>
#define MAX 8192
struct hash_node
int data;
struct hash_node *next;
;
int hash_num(int num)

static struct hash_node table[MAX];
struct hash_node *q = NULL;
struct hash_node *p = NULL;
int index;
index = abs(num) % MAX;
p = &table[index];
while (p->next != NULL)
if (p->next->data == num)
q = malloc(sizeof(struct hash_node));
q->data = num;
q->next = p->next->next;
p->next->next = q;
return 1;

p = p->next;

if (p->next == NULL)
p->next = malloc(sizeof(struct hash_node));
p->next->data = num;
p->next->next = NULL;
return 0;


int main()

int n = 0;
int i = 0;
int num = 0;
int cnt = 0;
printf("Please input n: ");
scanf("%d", &n);
printf("Please input n nums:\n");
for (i = 0; i < n; ++i)
scanf("%d", &num);
if (hash_num(num) == 0)
cnt++;

printf("%d", cnt);
return 0;
本回答被提问者和网友采纳

休眠查询以匹配映射实体集合与给定集合中的至少一个元素,多对多关系

【中文标题】休眠查询以匹配映射实体集合与给定集合中的至少一个元素,多对多关系【英文标题】:Hibernate Query to match mapped entity collection with at least one element in given collection, ManyToMany relationship 【发布时间】:2021-08-25 19:28:58 【问题描述】:

我的所有者实体:

@Entity(name = "SubscriptionEntity")
@Table(name = "SUBSCRIPTION", uniqueConstraints = 
        @UniqueConstraint(columnNames = "ID"))
 
public class SubscriptionEntity implements Serializable 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    private Integer subscriptionId;
 
    @Column(name = "SUBS_NAME", unique = true, nullable = false, length = 100)
    private String subscriptionName;
     
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name="READER_SUBSCRIPTIONS", joinColumns=@JoinColumn(referencedColumnName="ID")
                                        , inverseJoinColumns=@JoinColumn(referencedColumnName="ID"))
    private Set<ReaderEntity> readers;
 
    //Getters and setters

映射实体:

@Entity(name = "ReaderEntity")
@Table(name = "READER", uniqueConstraints = 
        @UniqueConstraint(columnNames = "ID"),
        @UniqueConstraint(columnNames = "EMAIL"),
        @UniqueConstraint(columnNames = "USERNAME")
 
public class ReaderEntity implements Serializable 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    private Integer readerId;
 
    @Column(name = "EMAIL", unique = true, nullable = false, length = 100)
    private String email;
 
    @Column(name = "USERNAME", unique = false, nullable = false, length = 100)
    private String username;
 
    @ManyToMany(mappedBy="readers") 
    private Set<SubscriptionEntity> subscriptions;
 
    //Getters and setters

现在,我有一个 subscriptionList,其中包含很少的订阅。我想要一个ReaderEntity 对象的分页列表,其订阅至少属于subscriptionList 中的一个。即ReaderEntity.subscriptionssubscriptionList 的交集应该至少是一个。

我参考了这篇文章并写了一个查询: Hibernate or SQL Query M-N member of with collections?

@Query("SELECT r FROM ReaderEntity r LEFT JOIN r.subscriptions s WHERE (s.subscriptionName in (:subscriptionList))")
Page<User> findAllBySubscriptions(@Param("subscriptionList") Set<String> subscriptionList, Pageable pageable);

但如果subscriptionList 中的多个元素与实际ReaderEntity.subscriptions 匹配,则此查询会填充重复条目。

我不能使用Distinct,因为可分页包含排序顺序,它按用户名对列表进行排序,不区分大小写。所以它在末尾附加order by lower(username) 并抛出错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

谁能帮我制定这个查询或指导我如何实现这一目标?

【问题讨论】:

【参考方案1】:

使用提示pass distinct through

@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.PASS_DISTINCT_THROUGH, value = "false"))
@Query("SELECT distinct r FROM ReaderEntity r LEFT JOIN r.subscriptions s WHERE (s.subscriptionName in (:subscriptionList))")
Page<User> findAllBySubscriptions(@Param("subscriptionList") Set<String> subscriptionList, Pageable pageable);

【讨论】:

以上是关于给定一个集合,查找集合中一共多多少种不同的元素的主要内容,如果未能解决你的问题,请参考以下文章

休眠查询以匹配映射实体集合与给定集合中的至少一个元素,多对多关系

Hibernate Query 将映射实体集合与给定集合中的至少一个元素匹配,并且不能在另一个多对多关系中匹配

网易2017春招笔试真题编程题集合——集合

【C语言】查找:给定有10个元素的整数数组,输入一个数,在数组中查找是该数

如何证明,在n个元素组成的集合中取n+1个不同的三元子集,求证必有两个子集,它们恰有一个公共元?

并查集