虾皮笔试 虾皮笔试题 0817
笔试时间:2025年8月17日
往年笔试合集:
第一题:分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
样例输入
[1,5,11,5]
样例输出
true
参考题解
Python:
class Solution: def IsPartition(self, nums): m, mod = divmod(sum(nums), 2) if mod: return False n = len(nums) f = [[False] * (m + 1) for _ in range(n + 1)] f[0][0] = True for i, x in enumerate(nums, 1): for j in range(m + 1): f[i][j] = f[i - 1][j] or (j >= x and f[i - 1][j - x]) return f[n][m]
第二题:数字比较游戏
Shopee算法团队进行团建游戏,游戏规则如下:X给出两个20以内的数字串num1和num2,长度一样,Y在10s内按规则回答:num2中有多少位数字和位置和num1完全一致(称为A),num2中有多少位数字和num1一致但位置不对(称为B)。请写出一个根据的函数,根据输入的num1和num2按规则分析,返回字符串的格式为xAyB,x和y都是数字。xA 表示num2有x位数字在num1中,且位置一致。yB 表示num2有y位数字在num1中,但位置不一致。请注意num1和num2都可能含有重复数字,每位数字只能统计一次。
样例输入
"1123","0111"
样例输出
"1A1B"
参考题解
C++:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string NumCompare(const string& num1, const string& num2) {
int n = (int)num1.size();
int a = 0, b = 0;
vector<char> matched1(n, 0), matched2(n, 0);
// 先数位置完全相同的(A)
for (int i = 0; i < n; ++i) {
if (num1[i] == num2[i]) {
a++;
matched1[i] = matched2[i] = 1;
}
}
// 收集剩余未匹配字符
vector<char> r1, r2;
r1.reserve(n); r2.reserve(n);
for (int i = 0; i < n; ++i) if (!matched1[i]) r1.push_back(num1[i]);
for (int i = 0; i < n; ++i) if (!matched2[i]) r2.push_back(num2[i]);
// 统计 r1 中每个字符的频次
unordered_map<char, int> freq;
for (char c : r1) freq[c]++;
// 在 r2 中尽量匹配(B)
for (char c : r2) {
auto it = freq.find(c);
if (it != freq.end() && it->second > 0) {
b++;
it->second--;
}
}
return to_string(a) + "A" + to_string(b) + "B";
}
};
Java:
import java.util.*;
class Solution {
public String NumCompare(String num1, String num2) {
int n = num1.length();
int a = 0, b = 0;
boolean[] m1 = new boolean[n], m2 = new boolean[n];
// 先数位置完全相同的(A)
for (int i = 0; i < n; i++) {
if (num1.charAt(i) == num2.charAt(i)) {
a++;
m1[i] = m2[i] = true;
}
}
// 收集剩余未匹配字符
ArrayList<Character> r1 = new ArrayList<>();
ArrayList<Character> r2 = new Ar
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025 春招笔试合集 文章被收录于专栏
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

