单链表问题:输入一串字符,要求分别统计出各个字符出现的次数
该如何实现这个问题啊,我知道用单链表能够解决,但是还有没有最优的方法,求各个指点指点
[解决办法]
为啥要用链表?
如果只是ASCII字符的话,开一个256大的数组统计就OK了
[解决办法]
要么用可变长度数组?关键是长度不定
[解决办法]
1#说得好
[解决办法]
学习来的
[解决办法]
难道你想用map?
[解决办法]
用哈希表嘛,干嘛要用链表
开一个127个元素的数组,每个字符转换成整型值就哈希成数组元素的位置,然后每扫描一个字符,就去该字母在数组中对应位置加1,最后,遍历一遍数组就知道了噻
[解决办法]
用map表,以字符本身为索引,节点为出现的次数,
typedef std::map<char,int> CharMap;
CharMap g_map;
void Countchar(char ch)
{
CharMap::iterator iter= g_map.find(ch);
if(iter==g_map.end())
g_map[ch]=1;
else
iter->second+=1;
}
void OutCount()
{
CharMap::iterator iterbeg= g_map.begin();
CharMap::iterator iterend= g_map.end();
CharMap::iterator iter= g_map.begin();
for(iter=iterbeg;iter!=iterend;iter++)
{
TRACE("字符%c出现%d次\r\n",iter->first,iter->second);
}
}
void Test()
{
char *ptest="1111111aaadddddddddffff";
int len=strlen(ptest);
for(int i=0;i<len;i++)
{
//遍历统计每个字符
Countchar(ptest[i]);
}
//输出统计结果
OutCount();
}
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
//charNum[0]~charNum[255]分别对应ASCII码中各字符出现的次数 在输入字符串之前都是0
int charNum[256] = {0};
char *str = "babshasgfsfdjkfghfkldhh234gkrthggh4y682378462tej";
char *c = str;
while(*(c++))charNum[*c]++;//*c做下标是亮点 这样可以快速定位 绝对比链表快
//打印结果
for(int i = 0; i<256; i++)if(0!=charNum[i])printf("%c %d\n", i, charNum[i]);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
// 统计ASCII字符出现次数
int count[257 = {0};
char ch;
//从键盘不断输入,直到回车
while ( (ch = getchar()) != '\n')
{
count[ch - 0]++;
}
for (int i = 0; i < 257; i++)
{
if( count[i] )
cout < < (char)i < < ":" < < count[i] < < endl;
}
return 0;
}