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

C++ 笔试刷题 Day 16:字符串替换、神奇数及 DNA 序列

C++ 笔试刷题 Day 16 涵盖字符串格式化替换、区间内神奇数统计及 DNA 序列滑动窗口查找。分别通过遍历匹配字符、枚举组合判断质数、维护定长窗口计数三种方式解决。重点在于边界条件处理和代码规范性,适合备战面试时练习基础算法能力。

忘忧发布于 2026/3/15更新于 2026/9/855 浏览
C++ 笔试刷题 Day 16:字符串替换、神奇数及 DNA 序列

C++ 笔试刷题 Day 16

今天整理了三道经典的 C++ 算法题,涵盖字符串处理、数字逻辑和滑动窗口。咱们直接过一遍思路和代码。

一、字符串替换

题目描述

给定一个字符串 A 及其长度 n,以及一个字符数组 arg 和元素个数 m。要求在 A 中找到所有的 %s 占位符,并依次用 arg 中的字符进行替换。

思路分析

这题其实不难,核心逻辑很直观:遍历原字符串,遇到 %s 就取下一个可用字符填入结果串。没必要原地修改,新建一个结果串 ret 更稳妥。

注意点:

  • %s 的数量可能少于 arg 中的字符数量,多余的字符也要追加到结果末尾。
  • 循环边界要处理好,避免越界。

代码实现

class StringFormat {
public:
    string formatString(string A, int n, vector<char> arg, int m) {
        string ret;
        int sz = A.size();
        int k = 0;
        for (int i = 0, j = 1; j < sz; i++, j++) {
            if (A[i] != '%' || A[j] != 's') {
                ret += A[i];
            } else {
                ret += arg[k++];
                i++; 
                j++; // 跳过已匹配的 s
            }
        }
        // 处理最后一个字符,防止漏掉非 %s 结尾的情况
        if (sz > 1 && A[sz - 2] != '%') {
            ret += A[sz - 1];
        }
        while (k < arg.size()) {
            ret += arg[k++];
        }
        return ret;
    }
};

二、神奇数

题目描述

给定区间 [l, r],统计其中'神奇数'的个数。如果一个数的任意两位组成的两位数(如 12, 21)是质数,则该数为神奇数。

思路分析

暴力枚举即可。遍历区间内每个数,提取每一位数字,两两组合成两位数,判断是否为质数。

判断质数优化:

  • 小于 2 不是质数。
  • 只需遍历到 sqrt(x) 即可。

代码实现

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

bool isPrime(int x) {
    if (x < 2) return false;
    for (int i = 2; i <= sqrt(x); i++) {
        if (x % i == 0) return false;
    }
    return true;
}

int check(int n) {
    vector<int> num;
    while (n) {
        num.push_back(n % 10);
        n /= 10;
    }
    for (int i = 0; i < num.size(); i++) {
        for (int j = 0; j < num.size(); j++) {
            if (i != j && num[i] != 0) {
                if (isPrime(num[i] * 10 + num[j])) return 1;
            }
        }
    }
    return 0;
}

int main() {
    int l, r;
    cin >> l >> r;
    int ret = 0;
    for (int i = max(10, l); i <= r; i++) {
        ret += check(i);
    }
    cout << ret << endl;
    return 0;
}

三、DNA 序列

题目描述

给定由 A/C/G/T 组成的字符串 str 和整数 n。找出长度为 n 的子串,使得该子串中 C 和 G 的数量尽可能多,输出该子串。

思路分析

典型的滑动窗口问题。维护一个长度为 n 的窗口,统计窗口内 C/G 的个数,记录最大值对应的起始位置。

关键点:

  • 使用 count 记录当前窗口内目标字符数量。
  • 当窗口大小超过 n 时,左指针右移并更新 count。
  • 每次移动后比较 maxcount,更新最优解。

代码实现

#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    int n;
    cin >> str >> n;
    
    int begin = -1, count = 0, maxcount = 0;
    for (int left = 0, right = 0; right < str.size(); right++) {
        if (str[right] == 'C' || str[right] == 'G') {
            count++;
        }
        
        while (right - left + 1 > n) {
            if (str[left] == 'C' || str[left] == 'G') {
                count--;
            }
            left++;
        }
        
        if (count > maxcount) {
            begin = left;
            maxcount = count;
        }
    }
    
    if (begin != -1)
        cout << str.substr(begin, n) << endl;
    return 0;
}

以上三道题涵盖了常见的面试考点,建议动手敲几遍加深理解。

目录

  1. C++ 笔试刷题 Day 16
  2. 一、字符串替换
  3. 题目描述
  4. 思路分析
  5. 代码实现
  6. 二、神奇数
  7. 题目描述
  8. 思路分析
  9. 代码实现
  10. 三、DNA 序列
  11. 题目描述
  12. 思路分析
  13. 代码实现

更多推荐文章

查看全部
  • 转行 Python 工程师:学习路径与数据分析方向指南
  • 使用 Trae AI 将设计稿自动生成前端代码指南
  • 企业级供应商管理系统开发实践与技术选型总结
  • Python 爬虫入门实战指南
  • 阿里通义千问 Qwen3-Coder:智能代码生成与代理式编程
  • OpenClaw 对接 QQ 机器人教程:本地与云端部署方案
  • LangChain 输出解析器与 LCEL 链构建详解
  • 利用 AI 编程助手 7 天完成 Spring Boot 电商后台系统开发
  • GraphRAG 结合 Ollama 实现本地化部署完整教程
  • LangChain 大模型输出结构化解析指南
  • Amazon Bedrock 模型微调实践:微调基础篇
  • Llama 3.1 本地部署与 API 服务搭建
  • OpenClaw 系统架构深度解析
  • VSCode 自定义 Copilot Agent 与 Awesome Agent 模板
  • AI Skills 核心概念、使用指南与 Java 生成实战
  • 主流 AI 编程助手对比:Copilot 与国产替代方案分析
  • 预训练语言模型与 BERT 实战应用
  • C 语言多线程与并发编程:提高程序执行效率
  • Python 实现月相计算与可视化系统
  • 智能咖啡厅助手:人形机器人大模型与行为驱动控制

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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