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

C++ 笔试刷题实战:数字重排、队列约束与二叉树路径和

本题集包含三道 C++ 算法题,分别涉及数字重排、队列约束与二叉树路径和。第一题考察字符串操作与贪心策略,通过交换数位实现偶数重排;第二题利用回溯法解决带约束的排列计数问题,重点在于剪枝逻辑;第三题深入二叉树递归,通过后序遍历计算最大路径和,需妥善处理负值对路径的影响。代码均经优化,注重边界条件与时间复杂度控制,适合面试备考参考。

FlinkHero发布于 2026/3/24更新于 2026/6/2325 浏览
C++ 笔试刷题实战:数字重排、队列约束与二叉树路径和

一、数字重排为偶数

题目描述

给定 q 组数据,每组输入一个正整数 x。要求重排 x 的数位,使其变为偶数并返回结果。若 x 本身已是偶数则直接返回;若无法通过重排得到偶数,返回 -1。

解题思路

判断一个数是否为偶数,只需看其个位数字。我们将输入视为字符串处理更为方便。

  1. 检查最后一位是否为偶数,若是则直接返回原串。
  2. 若否,从前往后遍历寻找第一个偶数位,将其交换至末尾。
  3. 若遍历结束仍未找到偶数位,说明无解,返回 -1。
#include <iostream>
using namespace std;

string solve() {
    string str;
    cin >> str;
    int n = str.size();
    // 检查最后一位是否为偶数
    if ((str[n - 1] - '0') % 2 == 0) return str;
    // 寻找第一个偶数位并交换到末尾
    for (int i = 0; i < n - 1; i++) {
        if ((str[i] - '0') % 2 == 0) {
            swap(str[i], str[n - 1]);
            return str;
        }
    }
    return "-1";
}

int main() {
    int q;
    cin >> q;
    while (q--) {
        cout << solve() << endl;
    }
    return 0;
}

二、体操队形排列方案

题目描述

有 n 名队员(编号 1~n),每人有一个诉求 a[i],表示 i 号队员必须排在 a[i] 的前面。若 a[i] == i 则表示无特殊要求。求满足所有条件的排队方案总数。

解题思路

这是一个典型的回溯问题。我们需要按位置依次填入队员,同时维护已使用状态和约束条件。

  1. 使用 vis 数组记录队员是否已被安排。
  2. 递归尝试将每个未使用的队员放入当前空位。
  3. 关键剪枝:如果当前队员 i 的诉求对象 arr[i] 已经被安排了,那么 i 必须排在 arr[i] 前面,这会导致冲突,因为 arr[i] 已经在前面了。此时该分支无效,直接回溯。
  4. 当填满所有位置时,方案数加一。
#include <iostream>
using namespace std;

int arr[11];      // 每个队员的诉求
bool vis[11];     // 记录队员是否被排过
int ret = 0;      // 最终结果
int n;

void dfs(int pos) {
    if (pos == n + 1) {
        ret++;
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (vis[i]) continue; // 队员已用过
        // 如果该队员的诉求对象已经排过了,说明无法满足 i 在 arr[i] 前面的条件
        if (vis[arr[i]]) return; 
        
        vis[i] = true;
        dfs(pos + 1);
        vis[i] = false; // 回溯
    }
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    dfs(1);
    cout << ret << endl;
    return 0;
}

三、二叉树中的最大路径和

题目描述

给定一棵二叉树,求任意路径的最大路径和。路径定义为从任意节点出发,到达任意节点的序列,节点可向上或向下移动,但同一节点只能经过一次。路径至少包含一个节点。

解题思路

此题适合使用后序遍历(DFS)。对于每个节点,我们需要计算两个值:

  1. 单侧最大路径和:以当前节点为起点,向左或向右延伸的最大路径和(用于返回给父节点)。
  2. 全局最大路径和:以当前节点为转折点(即路径经过当前节点,连接左右子树)的最大和。

关键点在于处理负数。如果某条子路径的和小于 0,不如不选(相当于截断),因此取 max(0, 子路径和)。 更新全局最大值时,考虑左子树贡献 + 右子树贡献 + 当前节点值。 返回值时,只返回当前节点值 + max(左,右),保证是单侧路径。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int ret = -1010;

    int dfs(TreeNode* root) {
        if (root == nullptr) return 0;
        
        // 获取左右子树的最大贡献值,若为负则取 0
        int left = max(dfs(root->left), 0);
        int right = max(dfs(root->right), 0);
        
        // 更新全局最大路径和(以当前节点为最高点的路径)
        ret = max(ret, root->val + left + right);
        
        // 返回当前节点能提供的最大单侧路径和
        return root->val + max(left, right);
    }

    int maxPathSum(TreeNode* root) {
        dfs(root);
        return ret;
    }
};

目录

  1. 一、数字重排为偶数
  2. 题目描述
  3. 解题思路
  4. 二、体操队形排列方案
  5. 题目描述
  6. 解题思路
  7. 三、二叉树中的最大路径和
  8. 题目描述
  9. 解题思路
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 三款主流云电脑部署 DeepSeek 模型实测对比
  • 基于 SpringBoot 的图书购买系统 Redis 分页展示与前后端交互实现
  • AudioSeal 在 Whisper 生成音频中检测并提取原始水印
  • OpenClaw 网络搜索与抓取工具最佳实践指南
  • GitHub Pages 制作个人主页教程
  • C/C++ 全局变量跨文件真相:实验验证与底层原理
  • C++ 四十年演进史:从 C with Classes 到现代标准
  • ToDesk、顺网云与海马云部署 DeepSeek 模型对比评测
  • Vivado 中 ILA 集成逻辑分析仪在线调试方法
  • Python 项目依赖管理:requirements.txt 与 pyproject.toml 规范
  • ToDesk 与顺网、海马云 DeepSeek 部署体验对比
  • 手机端运行 Stable Diffusion 的开源 AI 绘画工具
  • Java 社区跑腿家政上门服务商城解决方案
  • ToDesk、顺网云与海马云:DeepSeek 大模型云端部署实测对比
  • OpenClaw 在 Mac 上本地化部署及接入飞书教程
  • 手机端 Stable Diffusion 开源工具使用指南
  • 前端缓存策略最佳实践
  • HTML 标签详解:构建网页骨架的核心语法与用法
  • 手机端本地运行 Stable Diffusion 的开源方案
  • Linux 匿名管道通信:原理与代码实现

相关免费在线工具

  • 加密/解密文本

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