青训营中的第431题 | 豆包MarsCode AI刷题

71 阅读3分钟

题目为数字字符串中圆圈的数量计算 具体描述为: 小I拿到了一串数字字符,她想知道这串数字中一共有多少个圆圈。具体规则如下:

  • 数字0、6、9各含有一个圆圈。
  • 数字8含有两个圆圈。
  • 其他数字不含有任何圆圈。

思路是这样的: 这个问题可以通过遍历字符串中的每个字符来解决。我们可以定义一个映射表,记录每个数字对应的圆圈数量,然后遍历输入字符串,根据映射表累加每个字符的圆圈数。 可以画图来解释: 假设输入字符串为 "1234567890",我们可以通过以下步骤计算圆圈的数量:

  1. 定义映射表 circle_count,其中 circle_count[0] = 1circle_count[6] = 1circle_count[9] = 1circle_count[8] = 2
  2. 遍历字符串中的每个字符,根据映射表累加圆圈数。

我用C++语言来演示这个算法

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int countCirclesInString(const string& s) {
    // 定义数字到圆圈数量的映射
    unordered_map<char, int> circle_count = {
        {'0', 1},
        {'6', 1},
        {'9', 1},
        {'8', 2}
    };

    int total_circles = 0;
    // 遍历字符串中的每个字符
    for (char c : s) {
        if (circle_count.find(c) != circle_count.end()) {
            total_circles += circle_count[c];
        }
    }
    return total_circles;
}
int main() {
    string s;
    cin >> s;
    cout << countCirclesInString(s) << endl;
    return 0;
}

根据这道题我了解到哈希表的知识点: 使用 unordered_map 来存储数字和其对应的圆圈数量,可以快速查找并累加圆圈数。 通过 for (char c : s) 这种范围基于的循环方式,可以简洁地遍历字符串中的每个字符。 使用 if (circle_count.find(c) != circle_count.end()) 判断当前字符是否在映射表中,从而决定是否累加圆圈数。 写完之后我有自己的见解: 1,哈希表是一种非常高效的数据结构,适用于需要快速查找和插入/删除操作的场景。在本题中,哈希表帮助我们快速查找每个数字对应的圆圈数量。 2,掌握字符串的基本操作(如遍历、查找、替换等)对于解决许多实际问题非常重要。 3,通过使用现代C++特性(如范围基于的循环),可以使代码更加简洁易读。 因此我给自己制定了刷题计划: 1,明确自己的学习目标,比如掌握基本的数据结构和算法。 2,选择合适的题库,如LeetCode、Codeforces等,这些平台提供了丰富的题目和详细的题解。 3,根据自己的时间和能力,合理安排每天需要解决的问题数量。初期可以选择一些基础题型,随着技能的提升逐渐挑战更难的题目。 然后在错题中积累经验,将每次刷题中做错的题目记录下来,分析错误原因;定期回顾错题,确保自己真正理解了错误的原因,并能正确解决这些问题;对于错题中涉及的知识点,可以查阅相关资料或参加线上课程,进行深入学习。 我还会用课下的时间去看一些丰富的开源,提升AI刷题的技能 通过这里我还学到了对于非常长的字符串,可以考虑使用多线程来加速计算。将字符串分成多个子串,每个子串由一个线程处理,最后汇总结果。虽然本题不需要动态规划,但对于更复杂的问题,动态规划可以用来解决具有重叠子问题和最优子结构性质的问题。例如,如果需要计算所有可能的子串中圆圈的最大数量,可以使用动态规划来优化。 未来,我将继续利用这一强大的工具,不断探索和学习,为实现自己的梦想而努力。希望我的经验能对其他学习编程的同学有所帮助,让我们一起在编程的世界里不断前行。