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

C++ 笔试刷题实战:偶数重组、排队方案与二叉树路径和

本文涵盖三道 C++ 笔试高频算法题。第一题通过字符串重排将奇数转为偶数,核心是定位末位偶数并交换;第二题体操队形问题利用回溯法枚举排列,需校验前驱约束条件;第三题二叉树最大路径和采用后序遍历递归,关键在于处理负值子树对路径的贡献及维护全局最大值。代码已优化逻辑漏洞,可直接用于面试准备。

晚风告白发布于 2026/3/27更新于 2026/7/2432 浏览
C++ 笔试刷题实战:偶数重组、排队方案与二叉树路径和

一、重组偶数

题目描述

给定一组数据,每次输入一个正整数 x。要求将其重排成一个偶数并返回;如果 x 本身是偶数则直接返回。若无法通过重排得到偶数,则输出 -1。

解题思路

对于正整数 x,我们可以将其视为字符串处理,这样能更方便地操作每一位数字。判断一个数是否为偶数,只需看其最低位(末位)是否为偶数。

具体策略如下:

  1. 检查字符串最后一位,如果是偶数,直接返回原串。
  2. 如果不是,从前往后遍历寻找第一个偶数位,将其交换到末尾。
  3. 若遍历结束仍未找到偶数位,说明该数全由奇数组成,无法重排为偶数,返回 -1。
#include <iostream>
#include <string>
#include <algorithm>
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 名同学进行排队。第 i 号队员有一个诉求 a[i],表示 i 必须排在 a[i] 的前面。若 a[i] == i,则表示无特殊要求。求一共有多少种合法的排队方案。

解题思路

这是一个典型的回溯问题。我们需要依次确定每个位置的人选,同时满足前驱约束条件。

核心逻辑在于:当尝试将队员 i 放入当前空位时,需要检查两个条件:

  1. 队员 i 是否已经被安排过?
  2. 队员 i 的诉求对象 a[i] 是否已经排好队了?如果 a[i] 已排且不在 i 之前,则此路不通。

我们使用一个 vis 数组记录已排人员,递归尝试填充每一个位置。当所有位置填满时,方案数加一。

#include <iostream>
using namespace std;

int arr[11];      // 存储每个队员的诉求
bool vis[11];     // 标记队员是否已排
int ret = 0;      // 记录合法方案数
int n;

// pos: 当前要填充的位置索引
void dfs(int pos) {
    if (pos == n + 1) {
        ret++;
        return;
    }

    for (int i = 1; i <= n; i++) {
        if (vis[i]) continue; // 该队员已排过
        
        // 如果该队员的诉求对象已排过,但不在该队员前面,则不满足条件
        // 注意:这里假设 a[i] 是 i 必须排在它前面的那个人
        if (arr[i] != i && 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;
}

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

题目描述

给定一棵二叉树,找出任意路径的最大路径和。路径定义为从任意节点出发,到达任意节点的序列,同一节点在路径中最多出现一次。路径至少包含一个节点,不一定经过根节点。

解题思路

这道题是经典的树形 DP 或 DFS 问题。关键在于理解'路径'的定义:它可以是单向的(如左子树 -> 根),也可以是分叉的(左子树 -> 根 -> 右子树)。

我们在遍历每个节点时,需要计算两个值:

  1. 以当前节点为最高点的路径和:即 left_max + root->val + right_max。这用于更新全局最大值 ret。
  2. 从当前节点向下延伸的单侧最大路径和:即 root->val + max(left_max, right_max)。这是递归返回值,供父节点使用。

注意:如果某棵子树的最大单路径和小于 0,说明该子树对总和有负贡献,此时应视为 0(即不选择该子树)。

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

    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

更多推荐文章

查看全部
  • OpenAI Whisper 语音识别模型入门与实战指南
  • ChatGPT 如何利用结构化方法实现高效信息管理
  • 阿里开源 PageAgent:基于 DOM 的 Web 智能体框架
  • Stable Diffusion 数据集标签编辑器使用指南
  • 大模型测评:千问 DeepSeek 等工具降英文 AI 率横向对比
  • 打造高效的 LLM 多智能体系统:AgentPrune 通信剪枝优化
  • 基于 Go 的电子病历智能助手与 HIS 接口对接实战
  • Go语言中的未来:从泛型到WebAssembly
  • Spring Boot 数据访问与数据库集成实战
  • 利用 Higress 将 REST API 快速转换为 MCP Server
  • 数据结构基础:顺序表原理与动态实现详解
  • JDK 1.8 在 Windows 系统下的安装与配置教程
  • 3ds Max VR 渲染器及原生局部渲染设置
  • Python 包管理新范式:极速工具 uv 深度解析
  • Windows 下 Docker Desktop 安装及 WSL2 配置教程
  • Spring Boot 数据访问与数据库集成实战
  • 前端高频面试题:TypeScript 核心知识点
  • MySQL 迁移 TCO 全景账本:隐性成本与工程化工具链实测
  • 知网 AIGC 检测原理与降低疑似度的实战策略
  • AI 绘画精讲与 AIGC 游戏美术设计

相关免费在线工具

  • 加密/解密文本

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