虾皮笔试 虾皮笔试题 0423
笔试时间:2025年04月23日
历史笔试传送门:
第一题
题目:田忌赛马
田忌与齐王各有 n 匹马。每场比赛胜者得 200 两银子,败者输 200 两银子,平局不赔不赚。每匹马仅能出场一次。已知两人每匹马的速度,问田忌最多能赢多少银子。
排序双指针
• 分别将田忌和齐王的马从慢到快排序。
• 用四个指针:
• tl/th 指向田忌最慢/最快的马;
• ql/qh 指向齐王最慢/最快的马。
2. 贪心策略
• 如果田忌最快马能赢齐王最快马:肯定赢,配对并双双向前/向后移动最快指针,结果加 200。
• 否则,用田忌最慢马去“牺牲”对抗齐王最快马:亏 200,但可以保留田忌更快的马去赢别的对手;移动田忌最慢指针和齐王最快指针。
3. 终止条件
• 当田忌所有马都已出完(tl > th)时,循环结束。
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <vector> #include <algorithm> int maxWinning(std::vector<int> tj, std::vector<int> qw) { std::sort(tj.begin(), tj.end()); std::sort(qw.begin(), qw.end()); int ans = 0; int tl = 0, th = (int)tj.size() - 1; int ql = 0, qh = (int)qw.size() - 1; while (tl <= th) { if (tj[th] > qw[qh]) { // 田忌最快胜齐王最快 ans += 200; --th; --qh; } else { // 牺牲田忌最慢马对抗齐王最快 if (tj[tl] < qw[qh]) { ans -= 200; } ++tl; --qh; } } return ans; }
Java:[此代码未进行大量数据的测试,仅供参考]
public static int maxWinning(int[] tj, int[] qw) { Arrays.sort(tj); Arrays.sort(qw); int ans = 0; int tl = 0, th = tj.length - 1; int ql = 0, qh = qw.length - 1; while (tl <= th) { if (tj[th] > qw[qh]) { // 田忌最快胜齐王最快 ans += 200; th--; qh--; } else { // 牺牲田忌最慢马对抗齐王最快 if (tj[tl] < qw[qh]) { ans -= 200; } tl++; qh--; } } return ans; }
Python:[此代码未进行大量数据的测试,仅供参考]
from typing import List def max_winning(tj: List[int], qw: List[int]) -> int: tj.sort() qw.sort() ans = 0 tl, th = 0, len(tj) - 1 ql, qh = 0, len(qw) - 1 while tl <= th: if tj[th] > qw[qh]: # 田忌最快胜齐王最快 ans += 200 th -= 1 qh -= 1 else: # 牺牲田忌最慢马对抗齐王最快 if tj[tl] < qw[qh]: ans -= 200 tl += 1 qh -= 1 return ans
第二题
题目:括号匹配(且“[]”不得嵌在“()”内部)
给定一串混合字符的字符串,判断其中圆括号 () 和方括号 [] 的匹配是否有效,且不允许出现 [...] 完全嵌在 (...) 内部的情况。非括号字符忽略。
样例输入
()a((d))
样例输出
true
参考题解
1. 栈
• 遇到左括号 ( 或 [ 时入栈。
• 遇到右括号时:
• 若栈空,直接 false;
• 否则出栈并判断类型是否匹配。
2. 特殊限制
• 在入栈 [ 时,如果栈顶是 (,则立即 false,避免 [...] 嵌在 (...) 内部。
3. 遍历结束后,若栈空则整体合法,否则不合法。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <string> #include <stack> bool checkBrackets(const std::string &s) { std::stack<char> st; for (char ch : s) { if (ch == '(' || ch == '[') { // 不允许 '[' 在 '(' 内部入栈 if (ch == '[' && !st.empty() && st.top() == '(') { return false; } st.push(ch); } else if (ch == ')' || ch == ']') { if (st.empty()) { return false; } char top = st.top(); st.pop(); if ((ch == ')' && top != '(') || (ch == ']' && top != '[')) { return false; } } // 其他字符忽略 } return st.empty(); } int main() { std::string s; std::getline(std::cin, s); std::cout << (checkBrackets(s) ? "true" : "false") << "\n"; return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; import java.util.Stack; publicclass BracketValidator { public static v
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南