代码实现:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
/*
函数功能:统计字符数。
函数描述:一个字符串中其含有{a..z,A..Z},统计哪一个字符出现的次数最多,如果有多个出现的次数相同且最多,那么返回ascii码最小的那一个字符。
函数参数:str:需要统计的字符串。
len:字符串长度
ch:返回最多次数的最小ascii码字符
函数返回值: >0 统计成功并返回最多次数
0 无{a..z,A..Z}字符
-1 参数不合法
*/
int StatLetter(const char *str, int len, char *ch)
{
enum
{
_Max = 'z' - 'A' + 1,
};
int result;
int num;
int max;
// a..z,A..Z总共五十二个位置
int k; // 记录最大值的最小ascii值位置
// 参数不合法判断
if (!str || len < 0 || !ch)
result = -1;
else if (len != 0)
{
/* code */
// 字符频度统计处理
int count[_Max] = {0};
unsigned Delta;
const char *end1 = str + len;
for (; str < end1; str++)
{
Delta = (*str | 0x20) - 'a'; // 转化为小写算偏移值
if (Delta < 26) // 则为字母
{
count[*str - 'A']++;
}
}
int *max = count;
int *end2 = max + _Max;
int *pos = max + 1;
for (; pos < end2; pos++)
{
if (*max < *pos)
{
max = pos;
}
}
*ch = 'A' + (max - count);
result = *max;
}
return result;
}
int main()
{
char data[256]; // 字符数组
char *ch; // 返回值
int len; // 字符串长度
cout << "str:";
if (gets(data) != NULL)
{
len = strlen(data);
int num = StatLetter(data, len, ch);
cout << "返回 " << num << ", *ch: " << *ch << endl;
}
system("pause");
return 0;
}
代码思想:
第一模块首先利用大写字母和小写字母之间的ascii差值定值来进行换算,并且定义一个数组,数组大小等于‘z’-'a'+1,以ascii作为差值,初始化数组。其次建立字符频度数组count,将字符串中所有的字符与0x20进行或运算,这个操作可以将大写字符转化为小写字符,如果转化为小写的字符与‘a’的差值小于26,则这个字符就为字母,然后对其频度数组的对应位置的频度+1。
第二模块首先进行对频度数组的最大值检索,并返回第一个出现最大值的位置。并利用指针进行返值操作。
代码总结:
代码for循环上下要进行空格,头文件以及二目运算符也得要用空格,代码要可读性以及不能冗余。
大写字母转化为小写字母与0x20进行或运算.
for循环尽量用指针进行表示,可以提高效率。