统计数组中相同或者重复数字的个数,并输出

kojie_chen 2008-01-08 09:12:36
统计数组中相同或者重复数字的个数,并输出
数组已经经过排序,如
3
111111
111111
111111
输出
111111 3

4
11
11
22
22
输出
11 2
22 2

4
11
22
22
22
输出
22 3

6
11
11
11
33
66
66
输出
11 3
66 2
请用c写,其他不得分
...全文
3654 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanmuyi 2008-03-27
  • 打赏
  • 举报
回复
思路:

记录第i个元素的值;
while(未完成遍历)
{
if(第i+1个元素的值==第i个元素的值)
count++;
else
{
if(count>1)
printf(你要的结果);
count=0;
}
i++;
}

这个算法的复杂度与3楼相同,但实现方式略有差别~
csdn5211 2008-01-09
  • 打赏
  • 举报
回复
可以啊,在里面if呗,判断两个元素一不一样就行,不过不如用循环简洁而已,它们的效率是一模一样的。楼主你看看关于算法复杂度的知识吧,不要停留于表面。
gs0038 2008-01-09
  • 打赏
  • 举报
回复
//只用一个for太难.......
//在数组都是大于0的情况下,我是这么写的。。
#include "Stdio.h"
int main()
{
int m=0;
int a[]={1,3,3,8,8,8,8,1,3,1};//在数组都是大于0的情况下
int n=sizeof(a)/sizeof(int);
for(i=0;i<n;i++)
{
m=1;
if(a[i]==-1)continue;
for(j=i+1;j<n;j++)
if(a[i]==a[j])
{
m++;
a[j]=-1;
}
if(m>1)
printf("%d:%d\n",a[i],m);
}
if(m==0)printf("No\n");
return 0;
}


如果想保住原有的数组的话且是任何数组的话,就得另开一个数组空间来存放相等的数的编号组,。。然后下次遍历就得查i是否在相等数的编号组里。如果在编号组里就i++;
jiahuafu 2008-01-08
  • 打赏
  • 举报
回复
/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"

int main(void)
{
int cf[] = {1,3,3,7,8,8,8,8,9};
int i=0;
int j=0;

for(i=0;i<sizeof(cf)/sizeof(int);i++)
{

for(j=i+1;j<sizeof(cf)/sizeof(int);j++)
{
if(cf[i] == cf[j])
{
printf("One Match %d,%d,%d,%d,\n",cf[i],cf[j],i,j);
break;

}


}


}


getch();
return 0;
}
kongli 2008-01-08
  • 打赏
  • 举报
回复
呵呵,对应16楼
if(ibool==1)
{printf}
else
{printf}
csdn5211 2008-01-08
  • 打赏
  • 举报
回复
楼主到底要交流什么啊,效率已经不能再高了,还要什么思路啊。
jiahuafu 2008-01-08
  • 打赏
  • 举报
回复
/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"

int main(void)
{
int cf[] = {1,3,3,7,8,8,8,8,9};
int i=0;
int j=0;

for(i=0;i<sizeof(cf)/sizeof(int);i++)
{

for(j=i+1;j<sizeof(cf)/sizeof(int);j++)
{
if(cf[i] == cf[j])
{
printf("One Match %d,%d,%d,%d,\n",cf[i],cf[j],i,j);

}


}


}


getch();
return 0;
}
kojie_chen 2008-01-08
  • 打赏
  • 举报
回复
如果没有怎么相等的,哦,忘记了,
4
110
111
112
113
输出
NO就好了
kojie_chen 2008-01-08
  • 打赏
  • 举报
回复
什么年代啊,非要有钱才做啊,这个又不是很难,主要是交流一下,虽然高分有吸引力
kongli 2008-01-08
  • 打赏
  • 举报
回复
3楼,请问如果第一个和第二个数就不一样,会不会输出形如:“a[0],1”这样的结果呀?
kongli 2008-01-08
  • 打赏
  • 举报
回复
呵呵,刚开始学习,写个思路,别笑话哈~:)
int count;
int a[],b[],c[];//a[]存数组值,b[]存有重复值的数,c[]存重复个数
int i=0,j=0,ibool=0;
for(int i = 0; i<count-1; i++)
{
c[i] = 1;
if(a[i]==a[i+1])
{c[j]=c[j]+1;b[j]=a[i];ibool=1;}
else
{
if(c[j] !=1)
{
j++;
}
}
}
if(ibool==1)
{printf}
pptor 2008-01-08
  • 打赏
  • 举报
回复
才10分 也敢有要求,什么年代啊
csdn5211 2008-01-08
  • 打赏
  • 举报
回复
效率不能比O(n)再高啦,已经很高了,用不用循环都一样。
kojie_chen 2008-01-08
  • 打赏
  • 举报
回复
貌似count =1;i应该初始化
kojie_chen 2008-01-08
  • 打赏
  • 举报
回复
效率高吗?恩 ,好像是只遍历了一边。不好意思,我的意思是想说一个循环语句就能解决 的
for()
{
...
}
我看到你的while for了,呵呵
csdn5211 2008-01-08
  • 打赏
  • 举报
回复
楼主看看我的代码,只遍历了一遍。只需找到不一样的就行了,因为已经排好序了。
csdn5211 2008-01-08
  • 打赏
  • 举报
回复
我在三楼发的就是一遍循环啊!!!!
kojie_chen 2008-01-08
  • 打赏
  • 举报
回复
hash的算法我还不是特别清楚,hash可以是任何函数吗,干嘛非要用函数呢?计算不是更大吗》加快搜索速度?
kojie_chen 2008-01-08
  • 打赏
  • 举报
回复
我在想,能不能一次循环就解决问题的,边统计边输出
csdn5211 2008-01-08
  • 打赏
  • 举报
回复
如果没排好序,可以用红黑树或散列表来存储出现的次数,用树就是O(n*logn),散列表够大是O(n)。
加载更多回复(4)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧