怎么用桶排算出每个数字出现的次数c语言,有序数组统计各个数字出现的次数...

题目描述:给你一组有序数组,统计其中各个数字出现的次数(时间复杂度越低越好)

输入:1,1,2,2,2,3,6,6,10

输出:

1 2

2 3

3 1

6 2

10 1

上面要求时间复杂度越小越好,并且是已经排好序的,所以我们就不能用常规的求无序序列的方法求每个元素出现的次数,这样出来的结果肯定时间复杂度不尽如人意,也有人会想到桶排序,但这里给出的数字并没有要求在一个较小的范围内,并且如果出现负数的话,桶排序也就失效了,所以这里我们采用从前往后,依次比较的办法,新创建两个数组,一个存入不重复的元素,一个存相同元素出现的次数,这样可以实现时间复杂度为O(n)。

/*

*对有序数组统计每个元素出现的次数,时间复杂度越小越好

*/

#include

int main()

{

/*

桶排序

当有负数出现,或者输入的数大小跨度太的话,不是很很适合

*/

//int n,i,count,t,a[10000];

//count=0;

//while(scanf("%d",&n)!=EOF)

//{

//count++;

//if(count==1)

//{

//t=n; //标记初识输入数

//}

//a[n]++;

//}

//for(i=t;i<=n;i++)

//{

//if(a[i]!=0)

//printf("%d %d\n",i,a[i]);

//}

//顺序比较不相同的数字,统计,这个可能是最优的

int i,j,k,t,n,a[100],b[100],c[100];

n=0;

while(scanf("%d",&a[n])!=EOF)

{

n++;

}

i=0;

j=0;

k=0;

t=-1;

while(i

if(a[i]!=a[i+1]||i==n-1){

b[j]=a[i];

c[j]=i-t;

j++;

if(i==n-1)

break;

t=i;

}

i++;

}

for(i=0;i

printf("%d %d\n",b[i],c[i]);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值