题目描述
从键盘输入一行英文句子,句子中只有英文单词和空格,每个单词之间用若个空格隔开,英文单词由大小写字母组成,编程完成以下任务:
统计并输出此句子中英文字母的个数;
统计并输出此句子中单词的个数;
查找此句子中出现次数最多的字母(不区分大小写,大小写字母是相同的)及次数。当出现最多的字母不止一个时,全部找到,并输出找到的所有字母及次数。(输出顺序按字母顺序,且输出时字母全部小写)
输入格式
一行字符串。仅有空格和英文字母构成。
输出格式
第一行输出此句子中英文字母的个数。
第二行输出此句子中单词的个数。
第三行输出出现最多的字母,不止一个时,按字母顺序逐个输出,空格隔开。
第四行输出出现最多的字母的出现次数。
数据范围
输入字符串长度不超过 1000
。
样例
输入样例:
This is An Pencil Case
输出样例:
18
5
i s
3
算法1
双指针和计数数组
单词计数就用双指针模板,i和j指针维护一个单词的起始和结束,其中要保证i始终指向一个字母,j始终指向一个空格
这里要注意,题目给的条件是单词之间若干个空格
所以i = j
这一步可能让单词起始指针i指向一个空格,所以在循环体内首先对a[i]检查,保证i始终指向字母,避免将两个连续的空格识别成一个单词。
关键点 1. 双指针 2. 处理多个空格
for(int i = 0; i< len; i++){
if(a[i]!=' '){
int j = i;
while(j<len && a[j]!=' ') j++;
word_num ++;
i = j;
}
}
计数数组不再赘述
时间复杂度
o(n)
参考文献
C++ 代码
#include"iostream"
#include"string.h"
#define MAX 1005
using namespace std;
//输出英文字母的个数
//输出单词的个数
//出现最多的字母(不止一个)
//出现的次数
int main(){
char a[MAX];
cin.getline(a,MAX);
int word_num = 0,a_num = 0;
int count[26];
memset(count,0,sizeof(count));
int len = strlen(a);
for(int i = 0; i < len; i++){
if(a[i]>='A' && a[i] <='Z') a[i]+=32;
count[a[i]-'a']++;
}
//一定是从非空格的地方开始,到空格结束算一个单词
for(int i = 0; i< len; i++){
if(a[i]!=' '){
int j = i;
while(j<len && a[j]!=' ') j++;
word_num ++;
i = j;
}
}
int max_num = 0;
for(int i = 0; i < 26; i++){
if(count[i]>0) a_num +=count[i];
max_num = max(max_num,count[i]);
}
cout << a_num << endl;
cout << word_num << endl;//
for(int i = 0; i< 26; i++){
if(count[i]==max_num) cout << (char)(i+'a')<< ' ';
}
cout << endl << max_num << endl;
return 0;
}