问题描述
- C++编程 算法 求助!!!
- 在一篇英文文章中,输入一个字母,请输出与该字母一起出现频率最高的三个字母。
如:输入s,可能和s一起出现频率最高的就是t,e.....
想知道算法!!!如果可以,可以给个代码作为参考吗?非常谢谢
解决方案
之前回答过你的问题。
和计算出现频率最高的字母其实类似,只不过那个只需要一个向量保存结果,这个需要一个矩阵,保存字母转移关系。最后统计输出。要代码,请采纳。
解决方案二:
我的想法是这样:
建立一个代表字母的数组a[300],比如a[A]表示A出现的次数。
那么当搜索到一个单词的时候,如果出现了你一开始输入的那个字母,只要把这个单词里其他字母的对应a[(char)]++即可。
最后在这里找一下数字最大的三个就行啦!
解决方案三:
- 一起出现时什么概念?紧挨着出现?还是在同一个单词中出现?还是其他?这个需要说明才行。
- 我们假设说是同一个单词中出现,给你个算法。
- 1.两个数组,每个数组26个元素。一个数组作为最终结果,一个数组作为临时结果。一个标志位表示本单词中有没有出现目标字母
- 2.循环扫描文章。遇到目标字母,标志位设真;其他的,对应临时数组元素+1;遇到空格、tab、回车等分词符,判断标志位,决定是否将临时数组中的结果加到最终结果数组中,临时数组清空,标志位设假。
- 3.全部文章扫描完以后,在最终结果中选择数字最大的三个元素输出。
解决方案四:
c语言写的,这个跟c++应该没多少区别吧
#include <stdio.h>#include <stdlib.h>#include <ctype.h>int main(){ int count[26] = {0}; char keyword; char pre_kw; char ch; int i; FILE *fp; if((fp = fopen(""artical.txt""r"")) == NULL) { printf(""file open faild!n""); exit(0); } scanf(""%c"" &keyword); ch = fgetc(fp); while(feof(fp) == 0) { if(ch == keyword) { if(isalpha(pre_kw) != 0) count[tolower(pre_kw) - 97]++; pre_kw = ch; ch = fgetc(fp); if(isalpha(ch) != 0) count[tolower(ch) - 97]++; } else { pre_kw = ch; ch = fgetc(fp); } } for(i = 0; i< 26; i++) { if(i%8 == 0)printf(""n""); printf(""%c %d "" i + 97 count[i]); } printf(""n""); return 0;}
解决方案五:
@caozhy 请问能帮看一下吗?我知道有很多很明显的错误,请指点!
//第二题第一问
#include
#include
#include
#include
using namespace std;
int ar[27];//26个字母和非字母的个数
int ord[27];//26个字母的其他非字母的频率高低排序
int cmp(const void a const void *b)//执行减法的操作 ,不保存运算结果
{
return ar[(int )a] - ar[(int *)b];
}
int main()
{
int j;
char ch;
cout<<""请输入您想查询亲密关系的字母:""< cin>>ch;
memset(ar 0 sizeof(int) * 27);
ifstream in(""data1.txt"");//打开文件
for (string s; getline(ins);)
{
const char * pchar = s.c_str();//临时指针 ,内容不可变更
int len = strlen(pchar);
for (int j = 0; j < len; j++)
{
if ( pchar[j] == ch )
{
if(cin.peek()>='a'||cin.peek()>='z') ar[cin.peek() - 'a']++;//如果查询字符为当前字符,那么n的个数加1
if(cin.peek()<='A'||cin.peek()>='Z') ar[cin.peek() - 'A']++;
continue;
}
if ( cin.peek() == ch )
{
if(cin.peek()>='a'||cin.peek()>='z') ar[pchar[j]-'a']++;//如果查询字符为当前字符的下一个字符,那么当前字符的个数加1
if(cin.peek()<='A'||cin.peek()>='Z') ar[pchar[j]-'A']++;
continue;
}
}
}
for (int j = 0; j < 27; j++)
{
ord[j] = j;
};
qsort(ord 27 sizeof(int) cmp);//频率从小到大排序,在头文件stdlib.h中
for(j = 25;j >= 0;j--)
{
for(i=0;i<26;i++) cout<<(char)(bb[i]+97)<<c[i]<<' ';
}
cout<<endl;
in.close();
return 0;
}