统计不同单词个数
题目描述
输入一组单词,统计不同单词的个数,按单词个数升序输出统计结果(个数相同时,按单词升序排列)
输入
输入格式为每行一个单词,单词长度不超过20,单词之前无其他符号,单词之后直接换行 读取输入直到输入结束(不超过50行)
样例输入
red
red
blue
green
样例输出
blue 1
green 1
red 2
即统计每个单词个数,然后升序排序
实现代码:
#include<string.h>
#include<stdio.h>
int main()
{
char a[100][100]={},temp[100]={};
int i=0,cot[100]={0};
while(scanf("%s",a[i++])>0);
int n=i-1;
for(int i=0;i<n;i++){ //利用选择排序的原理
int k=i;
for(int j=i+1;j<n;j++){
if(strcmp(a[k],a[j])>=0)k=j;
}
if(k!=i){
strcpy(temp,a[k]);
strcpy(a[k],a[i]);
strcpy(a[i],temp);
for(int m=i+1;m<n;m++) //循环往下找,如果发现重复的,就扔掉(和最后一个元素交换,并n--)
if(strcmp(a[i],a[m])==0){
cot[i]++;
strcpy(temp,a[n-1]);
strcpy(a[n-1],a[m]);
strcpy(a[m],temp);
n--;
}
}
}
for(int i=0;i<n;i++){ //在无序数组中,找出第N小(第1小、第2小)的数并输出的方法,复杂度为O(n²)
int k=0;
for(int j=0;j<n;j++){
if(cot[j]<cot[k])k=j;
}
printf("%s %d\n",a[k],cot[k]+1);
cot[k]=1000; //这一步十分关键,将数组元素置为很大,就不会再输出这个元素
}
}
答案错误50%,没有成功AC,但我并不知道哪里错了,明明和正确答案的结果是一样的。
这是网上的正确代码(https://blog.csdn.net/phrenetic_/article/details/76462312):
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int n=0,i,t,k,a[60];
char b[60][30],c[30];
while(scanf("%s",b[n])!=EOF){
a[n]=1;
n++;
}
for(i=0;i<n;i++)
{
for(t=i+1;t<n;t++)
{
if(a[i]==0)continue;
if((strcmp(b[i],b[t])==0))
{
a[i]+=1;
a[t]=0;
}
}
}
for(i=0;i<n-1;i++)
{
for(t=i+1;t<n;t++)
{
if(a[i]>a[t])
{
strcpy(c,b[i]);
strcpy(b[i],b[t]);
strcpy(b[t],c);
k=a[i];a[i]=a[t];a[t]=k;
}
}
}
for(i=0;i<n-1;i++)
{
for(t=i+1;t<n;t++)
{
if((a[i]==a[t])&&(strcmp(b[i],b[t])>0))
{
strcpy(c,b[i]);
strcpy(b[i],b[t]);
strcpy(b[t],c);
k=a[i];a[i]=a[t];a[t]=k;
}
}
}
for(i=0;i<n;i++)
{
if(a[i])printf("%s %d\n",b[i],a[i]);
}
return 0;
}