数据结构与算法-字符出现的次数

问题描述

以下是这个找出字符串中字符串出现频率最多的字符。大家可以自行研究一下,题目不难,我今天尝试使用C语言来完成解答,但是在解答过程居然出现了一个意想不到的问题。可能是高级语言用多了,C语言某些函数的限制和风险忘记管控了o( ̄︶ ̄)o

在这里插入图片描述

解题思路

这种题目类似于hash的算法,也就是说我们可以使用数组索引[下标]来表示字母。

  • 例如字母’A’ 可以看做 ‘A’-‘A’ ,索引为0, ‘a’-‘a’ 索引为0,(tips,题目不区分大小写字母),
  • 字母’s’可以算出索引 int index = ‘s’ -‘a’ …, 依次类推。
  • 我就用索引表示字符,索引对应的数组的值表示出现次数,例如 a[0] =3,表示字符’a’或者’A’出现三次。

程序实现

输入字符串

char str[1000001];
if (fgets(str, sizeof(str), stdin) == NULL) {
        return 1;
}str[strcspn(str, "\n")] = 0;

遍历字符串更新数组中的出现次数

int a[26] = {0};
int max = 0;
char ch;
size_t len = strlen(str);
for (int i = 0; i < len; i++) {
    if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z') {
        int index = str[i] - (str[i] >= 'a' ? 'a' : 'A');
        a[index] += 1;
     } else {
          continue;
        }
    }

找出出现次数最多的字符

这里使用max记录出现次数为了比较,使用ch记录字符
因为数组的索引顺序(即字符顺序从a-z)自然满足了题目要求如果出现相同的只显示小的那个字符

  for (int i = 0; i < 26; i++) {
        if (max < a[i]) {  //只要比最大值大就交换,如果相同不处理
            max = a[i];
            ch = (char) i;
        }
    }

运行结果

sdfsfsd342452423
s 3

问题与处理

以上是修正后的代码,在之前版本中使用的是gets()函数进行输入,程序总报“含有较多字符”。在屡次实验分析之后发现C语言的gets()有可能造成输入的缓存溢出,也就是说输入的数量过大导致字符数组越界隐患。所以提交总是不能通过。
在这里插入图片描述
之后我们使用fgets替换了gets()函数解决了这一问题。

在这里插入图片描述

总结

以后在使用C语言这种未进行安全检查的语言时,需要程序员仔细分析函数的适用条件,代码可能存在的风险,保证代码的健壮性,这样你的开发能力才能有很大的提升。

相关推荐

  1. 【C++】字符串出现次数

    2024-06-18 23:32:03       11 阅读
  2. c++统计字符出现次数

    2024-06-18 23:32:03       19 阅读
  3. 计算某字符出现次数【C语言】

    2024-06-18 23:32:03       36 阅读
  4. python 统计列表相同数据出现次数

    2024-06-18 23:32:03       13 阅读
  5. 算法】【数据结构算法数据结构关系

    2024-06-18 23:32:03       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 23:32:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 23:32:03       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 23:32:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 23:32:03       20 阅读

热门阅读

  1. 定义仅限关键字参数

    2024-06-18 23:32:03       8 阅读
  2. NumPy 切片和索引

    2024-06-18 23:32:03       7 阅读
  3. 关于CSS

    关于CSS

    2024-06-18 23:32:03      5 阅读
  4. TOP150-LC121-买卖股票的最佳时机

    2024-06-18 23:32:03       6 阅读
  5. CSS 表单设计指南

    2024-06-18 23:32:03       5 阅读
  6. Samba服务访问异常分析处理

    2024-06-18 23:32:03       6 阅读
  7. 华为OD机试 C++ - 生日礼物

    2024-06-18 23:32:03       8 阅读
  8. Rust 的编译时间过长

    2024-06-18 23:32:03       6 阅读
  9. 软件开发小程序正规公司流程是什么样的?

    2024-06-18 23:32:03       9 阅读
  10. sklearn快速入门教程 ——2.基本数据探索

    2024-06-18 23:32:03       8 阅读