1042 字符统计(附详细注释,逻辑分析)

写在前面

  • 实现思路
    • 只处理字母(大小写)
    • 将字母hash到26个整数(巧妙)
    • 避免了字母字典排序问题
    • 注意: 避免通过scanf读入,存在空格等字符
  • 1题目较简单,0分钟内a题

测试用例

input:
This is a simple TEST.  There ARE numbers and other symbols 1&2&3...........

output:
e 7

ac代码

#include 
#include 
#include 
using namespace std;

const int maxn = 1010;
int hashTable[30] = {0};
int main()
{
    string str;
    getline(cin, str);

    for(int i=0; i<str.size(); i++)
    {
        if((str[i]>='a') && (str[i]<='z'))
            hashTable[str[i]-'a']++;
        else if ((str[i]>='A') && (str[i]<='Z'))
            hashTable[str[i]-'A']++;
    }
    int k=0;
    for(int i=0; i<26; i++)
        if(hashTable[i] > hashTable[k])
            k=i;
    printf("%c %d", 'a'+k, hashTable[k]);
    return 0;
}
  • 个人实现
    • 一层循环。次数大,交换字母、次数;次数等且字典序小,交换字母、次数
    • 字符串转大写、小写
#include 
#include 
using namespace std;

const int maxn = 1010;
int hashTable[256] = {0};
int main()
{
    string str;
    getline(cin, str);
    transform(str.begin(), str.end(), str.begin(), ::tolower);

    char max_ch='a';
    int max_cnt=0;
    for(int i=0; i<str.size(); i++)
    {
        if((str[i]<'a') || (str[i]>'z'))
            continue;
        hashTable[str[i]]++;
        if(((hashTable[str[i]]==max_cnt) && (str[i]<max_ch)) || (hashTable[str[i]]>max_cnt))
        {
            max_ch = str[i];
            max_cnt = hashTable[str[i]];
        }
    }
    printf("%c %d", max_ch, max_cnt);
    return 0;
}

学习代码

  • 1042. 字符统计(20).cpp
    • 实现思路
      • 一层循环,转小写
      • 一层循环,累计次数
      • 一层循环,求最大字符、最大次数
#include 
#include 
#include 
using namespace std;
int main() {
    string s;
    getline(cin, s);
    int a[26] = {0};
    for (int i = 0; i < s.length(); i++)
        s[i] = tolower(s[i]);
    for (int i = 0; i < s.length(); i++)
        if (islower(s[i])) a[s[i] - 'a']++;
    int max = a[0], t = 0;
    for (int i = 1; i < 26; i++) {
        if (a[i] > max) {
            max = a[i];
            t = i;
        }
    }
    printf("%c %d", t + 'a', max);
    return 0;
}

知识点小结

// 字符串读取
string str;
getline(cin, str);

// 字符串大小写转换 cctype
string str;
getline(cin, str);
transform(str.begin(),str.end(),str.begin(),::toupper);
transform(str.begin(), str.end(), str.begin(), ::tolower);
  • 大小写转换函数
    • touppertolower在C++中定义分别在std和cctype中
  • transform函数
    • 将某操作应用于指定范围的每个元素
    • transform(first,last,result,op);
      • first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class

你可能感兴趣的:(PAT(乙级),算法比赛相关)