虾皮笔试 虾皮笔试题 0817

笔试时间:2025年8月17日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:分割等和子集

给你一个 只包含正整数 的 非空 数组 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等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务