跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 笔试刷题实战:打怪、字符串分类及城市群问题解析

分享三道 C++ 算法面试题。第一题涉及数学模拟,计算在存活前提下击杀怪物的最大数量;第二题考察字符串处理,通过排序和哈希集合并类;第三题为图论基础,使用 DFS 求解连通分量(城市群)数量。文中提供了解题思路与完整 C++ 代码示例。

CoderByte发布于 2026/3/30更新于 2026/10/24114 浏览
C++ 笔试刷题实战:打怪、字符串分类及城市群问题解析

一、打怪

题目解析

我们现在要去刷毛球怪,我的攻击和血量是 h 和 a、毛球怪的攻击和血量是 H 和 A;

我们和毛球怪的对决是轮流攻击 (我们先手),当血量小于等于 0 时死亡;

现在我们要求在自己存活的条件下,最多能够杀死几只毛球怪;最后输出这个数量。

注意:如果能够杀死无数只怪物,就输出 -1

算法思路

对于这道题,首先我们想到的可能就是模拟整个打怪过程,然后记录杀死怪物的数量。

而对于模拟整个过程,程序运行的时间也太长了;而且如果我们能够杀死无数只怪物,那我们要一直模拟整个过程;那也太麻烦了。

有没有更加简单的方法?

这道题我们每一个怪物的血量和攻击都是固定的,那我们能不能求出来我们杀死一只怪物所受到的伤害,在根据我们自身的血量,不就可以直接计算出我们能够杀死多少只怪物吗?

所以我们的思路就是先求出来我们杀死一只怪物要攻击多少次,再求出自己所受到的伤害,最后直接计算出能够杀死怪物的数量。

计算杀死一只怪要攻击多少次:m = H/a + (H%a == 0?0:1); 我们要受到多少次攻击:n = m-1;(我们先手,所以我们受到攻击的次数比我们攻击的次数少一) 我们杀死一只怪要受到的伤害:r = n*A;(我们受到的伤害就等于受到攻击的次数 * 怪物的攻击) 能杀死怪物的最多数量:ret = h%r==0?(h/r-1):h/r; 题目的前提是我们要存活下来,如果 h%r==0,那在面对第 h/r 这只怪物时,我们的生命值是先减到 0 的,所以我们杀不死这一只怪,杀怪的数量就等于 h/r -1;如果 h%r != 0,那就说明杀死第 h/r 只怪以后我们还是存活的,那杀怪的数量就是 h/r。

最后我们来处理一下能够杀死无数只怪的问题

如果能够杀死无数只怪,那就说明我们杀死一只怪是没有掉生命值的; 那只有我们能够一次攻击杀死怪物才会无伤打怪,那也就是说我们的攻击 a 要大于等于怪物的生命 H 的。 所以当 a>=H 时,输出 -1 即可。

代码实现

#include <iostream>
using namespace std;

int h, a, H, A;

int fun(){
    if(H <= a) return -1;
    int n = H/a + (H%a == 0 ? 0 : 1); // 几次攻击能杀死一只怪
    int m = n - 1; // 杀死一只怪要受到几次怪物的攻击
    int r = m * A; // 杀死一只怪要受到的伤害
    int ret = h % r == 0 ? h / r - 1 : h / r;
    return ret;
}

int main(){
    int t; cin >> t;
    while(t--){
        cin >> h >> a >> H >> A;
        cout << fun() << endl;
    }
    return 0;
}

二、字符串分类

题目解析

这里题目给定 t 个字符串,让我们对这 t 个字符串进行分类;

对于字符串 A 和 B,如果 A 可以通过交换任意位置的两个字符,可以变换到 B(可以交换无数次)那字符串 A 和 B 就是属于同一类字符串;

例如:abcd、abdc、dcba 这些字符串都属于同一类。

算法思路

对于两个字符串,如果它们属于同一类,那这两个字符串中字符的种类和每一个字符出现的次数都是相等的。

如果我们直接去判断两个字符串中字符种类和字符出现的次数,那就非常麻烦了;

这里我们想一想,如果 A 和 B 字符串属于同一类,那它们中字符的种类和出现的次数都是相等的,那如果我们将字符串排一下序,那 A 和 B 排序后的结果是不是同一个字符串呢?

很显然是的,abcd 和 dcba 排序之后都是 abcd;

那字符串经过排序后的字符串是相等的,那这些字符串是不是都属于同一类字符串;

所以,我们这里思路就是:先对字符串进行排序,在记录一下排序后字符串的种类即可

  • 排序字符串:使用 sort 即可
  • 记录排序后字符串的种类:使用 hash 记录排序后字符串的种类

**结果:**我们只需要去 hash 表中查看字符串要多少种即可。

代码实现

#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;

int main(){
    int t; cin >> t;
    unordered_set<string> hash;
    while(t--){
        string str; cin >> str;
        sort(str.begin(), str.end());
        hash.insert(str);
    }
    cout << hash.size() << endl;
    return 0;
}

三、城市群数量

题目解析

题目给定一个 n 阶矩阵,其中每一个位置是 0 或 1;

如果 dp[i][j] == 1 就表示,第 i 个城市和第 j 个城市相连;(如果 a 城市和 b 城市相连,b 和 c 城市相连,那就任务 a 城市和 c 城市相连。)

现在我们要去求在这 n 个城市中,有多少个城市群。

算法思路

这道题,就是一道搜索题目,我们要使用深度优先遍历 dfs 或者广度优先遍历来解决 bfs。

思路简单来说就是,遍历每一个城市,如果这个城市还没有和其他城市成群,那就从当前城市来一次深度优先遍历 dfs,将它所在城市群的所有城市成群;

最后,我们只需要记录进行了几次 dfs(进行了多少次 dfs 那就表示存在多少个城市群)。

代码实现

class Solution{
public:
    bool vis[201]={false};
    
    void dfs(vector<vector<int>>& m, int pos, int n){
        vis[pos] = true;
        for(int i = 0; i < n; i++){
            if(m[pos][i] == 1 && vis[i] == false)
                dfs(m, i, n);
        }
    }
    
    int citys(vector<vector<int>>& m){
        int n = m.size();
        int ret = 0;
        for(int i = 0; i < n; i++){
            if(vis[i] == false){
                ret++;
                dfs(m, i, n);
            }
        }
        return ret;
    }
};

目录

  1. 一、打怪
  2. 题目解析
  3. 算法思路
  4. 代码实现
  5. 二、字符串分类
  6. 题目解析
  7. 算法思路
  8. 代码实现
  9. 三、城市群数量
  10. 题目解析
  11. 算法思路
  12. 代码实现

更多推荐文章

查看全部
  • 双指针算法实战:移动零与复写零解析
  • 数据结构:栈和队列的定义与实现
  • Python 正则表达式语法与使用指南
  • 动态规划:01 背包问题详解
  • 基于Realsense相机的机器人动态避障与路径优化实战
  • WebAssembly 跨平台优化:FFmpeg.wasm 架构解析与性能提升
  • Elasticsearch + Kibana 实战:安装部署与 C++ 客户端封装
  • Vivado IP 核 DDS 配置与原理详解
  • 基于 SFT 微调 Llama2 实现自我认知
  • C++ Core Guidelines 解析:让接口易于使用
  • 大模型工具函数调用(Function Calling)技术指南
  • 近两年 PbRL 及相关强化学习论文阅读总结
  • 大模型思维链(CoT)技术原理
  • H3C 交换机 NTP 时钟同步配置指南:命令行与 Web 界面详解
  • 基于 WebTop 与 Tailscale 实现云端 OpenClaw 真实桌面浏览器方案
  • 自然语言处理在金融领域的应用与实战
  • 大模型微调实战:LLaMA-Factory 快速上手
  • 高德地图 Web 端开发:API 安装与 Marker 地理编码实战
  • 树莓派 4B 连接大疆 M300 RTK 无人机 PSDK 开发指南
  • 医疗 AI 场景下逻辑回归算法深度解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online