虾皮笔试 虾皮笔试题 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等多种语言做法集合指南