当前位置:首页 > 技术 > 正文内容

2025年中科大计算机考研复试机试题解

访客 技术 2026年7月22日 4

整数转十六进制表示

实现一个算法,将给定整数转换为十六进制字符串形式。对于负数,采用补码表示;结果中除零本身外不应出现前导零,且所有字母均为小写。禁止使用内置的直接转换函数。

输入范围: −231 ≤ num ≤ 231 − 1

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

string intToHex(int val) {
    if (val == 0) return "0";
    unsigned int x = val;  // 利用无符号数自动处理补码
    string res;
    while (x > 0) {
        int digit = x & 0xF;
        if (digit < 10) res = char('0' + digit) + res;
        else res = char('a' + digit - 10) + res;
        x >>= 4;
    }
    return res;
}

网格中的岛屿计数

给定一个由字符 '1'(陆地)和 '0'(水)构成的二维网格,统计其中岛屿的个数。岛屿由相邻的陆地水平或垂直连接而成,网格四周视为水域。

#include <vector>
using namespace std;

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};

void eraseIsland(vector<vector<char>>& board, int r, int c) {
    if (r < 0 || r >= board.size() || c < 0 || c >= board[0].size()) return;
    if (board[r][c] != '1') return;
    board[r][c] = '0';
    for (int k = 0; k < 4; k++) {
        eraseIsland(board, r + dx[k], c + dy[k]);
    }
}

int countIslands(vector<vector<char>>& grid) {
    if (grid.empty() || grid[0].empty()) return 0;
    int rows = grid.size(), cols = grid[0].size();
    int total = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (grid[i][j] == '1') {
                total++;
                eraseIsland(grid, i, j);
            }
        }
    }
    return total;
}

最长连续递增子数组

在整数数组中找出连续递增子数组的最大长度。遍历过程中维护当前递增长度,遇到非递增时重置计数。

int maxAscendingLen(vector<int>& arr) {
    int n = arr.size();
    if (n <= 1) return n;
    int best = 1, cur = 1;
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[i-1]) {
            cur++;
            best = max(best, cur);
        } else {
            cur = 1;
        }
    }
    return best;
}

构造回文串的最少插入次数

求将字符串变为回文串所需的最少字符插入次数。等价于原串长度减去其最长回文子序列长度。

int minInsertions(string s) {
    int n = s.length();
    vector<vector<int>> dp(n, vector<int>(n, 0));
    for (int i = n-1; i >= 0; i--) {
        dp[i][i] = 1;
        for (int j = i+1; j < n; j++) {
            if (s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2;
            else dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
        }
    }
    return n - dp[0][n-1];
}

双值最大公约数

计算两个非负整数的最大公约数,采用欧几里得算法的迭代实现。

long long computeGCD(long long a, long long b) {
    while (b != 0) {
        long long tmp = a % b;
        a = b;
        b = tmp;
    }
    return a;
}

过河问题

多人过河类问题通常涉及动态规划或贪心策略。设每人过河耗时已知,每次最多两人乘船,求最短时间方案。

int riverCross(vector<int>& cost) {
    sort(cost.begin(), cost.end());
    int n = cost.size();
    if (n == 0) return 0;
    if (n == 1) return cost[0];
    if (n == 2) return cost[1];
    // 方案:最快者往返接送 vs 最快两人先过
    int res = 0;
    while (n > 3) {
        // 两种策略取较小
        int planA = cost[0] + 2*cost[1] + cost[n-1];
        int planB = 2*cost[0] + cost[n-1] + cost[n-2];
        res += min(planA, planB);
        n -= 2;
    }
    if (n == 3) res += cost[0] + cost[1] + cost[2];
    else if (n == 2) res += cost[1];
    else res += cost[0];
    return res;
}

火车票预订系统

模拟列车座位分配,处理区间查询与预订请求。可用线段树或差分数组维护各区间剩余票数。

struct TicketSystem {
    vector<int> diff;
    int stations;
    
    TicketSystem(int n) : stations(n), diff(n+1, 0) {}
    
    void book(int from, int to, int cnt) {
        diff[from] += cnt;
        diff[to+1] -= cnt;
    }
    
    bool check(int from, int to, int need) {
        int cur = 0;
        for (int i = 0; i <= to; i++) {
            cur += diff[i];
            if (i >= from && cur < need) return false;
        }
        return true;
    }
};

双栈模拟队列

使用两个栈实现队列的先进先出特性。一个栈负责入队,另一个负责出队,必要时转移元素。

template <typename T>
class QueueViaStacks {
    stack<T> inStack, outStack;
    
    void shift() {
        if (!outStack.empty()) return;
        while (!inStack.empty()) {
            outStack.push(inStack.top());
            inStack.pop();
        }
    }
    
public:
    void enqueue(T val) { inStack.push(val); }
    
    T dequeue() {
        shift();
        T val = outStack.top();
        outStack.pop();
        return val;
    }
    
    T peek() { shift(); return outStack.top(); }
    
    bool empty() { return inStack.empty() && outStack.empty(); }
};

方阵顺时针旋转

将 n×n 矩阵顺时针旋转90度,要求原地操作。采用分层处理,逐圈交换四个对应位置。

void rotateMatrix(vector<vector<int>>& mtx) {
    int n = mtx.size();
    for (int layer = 0; layer < n/2; layer++) {
        int first = layer, last = n - 1 - layer;
        for (int i = first; i < last; i++) {
            int offset = i - first;
            int top = mtx[first][i];
            mtx[first][i] = mtx[last-offset][first];
            mtx[last-offset][first] = mtx[last][last-offset];
            mtx[last][last-offset] = mtx[i][last];
            mtx[i][last] = top;
        }
    }
}

背包问题之小偷选择

给定物品重量与价值,在容量限制下求最大价值。经典01背包的动态规划解法。

int knapsack(vector<int>& wt, vector<int>& val, int cap) {
    int n = wt.size();
    vector<int> dp(cap + 1, 0);
    for (int i = 0; i < n; i++) {
        for (int w = cap; w >= wt[i]; w--) {
            dp[w] = max(dp[w], dp[w - wt[i]] + val[i]);
        }
    }
    return dp[cap];
}

任务调度优化

给定任务及其冷却时间,求完成所有任务的最短时间。贪心策略:优先安排出现次数最多的任务,利用最大堆或计数排序。

int leastInterval(vector<char>& tasks, int coolDown) {
    vector<int> freq(26, 0);
    for (char c : tasks) freq[c - 'A']++;
    sort(freq.begin(), freq.end());
    int maxFreq = freq[25];
    int idle = (maxFreq - 1) * coolDown;
    for (int i = 24; i >= 0 && freq[i] > 0; i--) {
        idle -= min(freq[i], maxFreq - 1);
    }
    return tasks.size() + max(idle, 0);
}
标签: USTC

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。