虾皮笔试 虾皮笔试题 0903

笔试时间:2024年09月03日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:最大总和

给定一个包含正整数的数组 nums 和一个正整数k,你需要从数组中选择k个数,使得这k个数的总和最大。

输入描述

数组nums,长度n,1≤n≤100,数组中的元素都是正整数。整数k,1≤k≤n。

输出描述

一个整数,表示选出的k个数的最大总和。

样例输入

[4,3,2,7,9],3

样例输出

20

参考题解

小顶堆。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int getMaxSum(const vector<int>& nums, int k) {
    // 使用优先队列(最小堆)来维护k个最大元素
    priority_queue<int, vector<int>, greater<int>> minHeap;

    // 遍历数组元素
    for (int num : nums) {
        // 如果堆还没有满,直接添加
        if (minHeap.size() < k) {
            minHeap.push(num);
        } else if (num > minHeap.top()) {
            // 如果堆已满且当前元素大于堆顶元素,替换堆顶元素
            minHeap.pop();
            minHeap.push(num);
        }
    }

    // 计算k个最大元素的总和
    int maxSum = 0;
    while (!minHeap.empty()) {
        maxSum += minHeap.top();
        minHeap.pop();
    }

    return maxSum;
}

Java:[此代码未进行大量数据的测试,仅供参考]

public static int getMaxSum(int[] nums, int k) {
        // 使用优先队列来维护k个最大元素
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        // 遍历数组元素
        for (int num : nums) {
            // 如果堆还没有满,直接添加
            if (minHeap.size() < k) {
                minHeap.offer(num);
            } else if (num > minHeap.peek()) {
                // 如果堆已满且当前元素大于堆顶元素,替换堆顶元素
                minHeap.poll();
                minHeap.offer(num);
            }
        }

        // 计算k个最大元素的总和
        int maxSum = 0;
        while (!minHeap.isEmpty()) {
            maxSum += minHeap.poll();
        }

        return maxSum;
}

Python:[此代码未进行大量数据的测试,仅供参考]

import heapq

def get_max_sum(nums, k):
    # 使用最小堆来维护k个最大元素
    min_heap = []

    # 遍历数组元素
    for num in nums:
        # 如果堆还没有满,直接添加
        if len(min_heap) < k:
            heapq.heappush(min_heap, num)
        elif num > min_heap[0]:
            # 如果堆已满且当前元素大于堆顶元素,替换堆顶元素
            heapq.heappop(min_heap)
            heapq.heappush(min_heap, num)

    # 计算k个最大元素的总和
    max_sum = sum(min_heap)

    return max_sum

第二题

题目:最频子串

给定一个字符串s和一个整数k,你需要找出字符串s中所有长度为k的子串中出现频率最多的子串。如果有多个子串出现频率相同,则返回字典序最小的那个子串。

输入描述

字符串s,长度n,1≤n≤100。

整数k,0≤k≤n。

输出描述

出现频率最高的子串。

样例输入

"mississippi",2

样例输出

“is”

说明

说明:is和si出现的频率一样,但是is在字典次序更小,所以输出is

参考题解

使用 HashMap 来存储每个长度为 k 的子串及其出现频率。2、遍历字符串 s,对于每个长度为 k 的子串,更新其在 HashMap 中的频率计数。3、找出最频子串:遍历 HashMap,找出出现频率最高的子串。如果存在多个子串出现频率相同,则选择字典序最小的子串。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

string findMostFrequentSubstring(const string& s, int k) {
    if (k == 0 || s.length() < k) {
        return "";
    }

    // 存储子串的频率
    unordered_map<string, int> frequencyMap;

    // 遍历所有长度为k的子串并计算频率
    for (int i = 0; i <= s.length() - k; i++) {
        string substring = s.substr(i, k);
        frequencyMap[substring]++;
    }

    // 找出频率最高的子串,并处理字典序
    int maxFrequency = 0;
    string mostFrequentSubstring = "";
    for (const auto& entry : frequencyMap) {
        const string& substring = entry.first;
       

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论
感觉虾皮笔试不难,不知道面试如何
点赞 回复 分享
发布于 10-08 16:49 广东

相关推荐

一面:上来先自我介绍,自我介绍完直接搞一个代码题1、平时设计模式用吗(答没怎么用过,但是知道单例模式),那你写一个单例模式吧(md我都答没怎么用过了,还要让我写,硬着头皮写了一个)2、讲一遍你这个单例模式的思路(口述一遍,口述完发现我把构造函数写到public里面了,被面试官指出)3、如果有不同的线程抢锁,怎么优化?4、高并发的时候加锁,大家都在等待,性能变差怎么办?在你这个代码上怎么优化?(想不出来,经过面试官现场教学后,补充上去了,其实就是如果已经实例化了,那就没必要抢锁,直接返回就好了)5、对嘛,如果balabala,那就balabala,就好了(教学时刻)(我:对对对,确实是这样,刚刚没考虑清楚-_-)手撕代码:一道回溯的字符串题目,字符串里只有a和b,返回字典序中的第k个字符串(指名要用回溯来做)6、这道题是什么数据结构,你能看出来吗?(这能是什么数据结构,回溯跟数据结构有什么关系?答了个栈)7、再想想,某个字母要么是a要么是b(卧槽,是二叉树啊,左子结点是a,又子节点是b)面试官好像很高兴,终于在提示下让我想出来了:“对,这个就是字典树”8、看你简历上写MySQL了,那SQL数据库底层是什么数据结构?9、讲讲B+树的特点10、HTTPS如何做到通信加密的?11、为什么要变成对称加密?讲讲12、数据一致性了解吗?2阶段提交听说过吗?13、双向链表有什么好处?14、经典反问全程下来,面试官还是很友好的,一直笑眼盈盈,好像在看菜鸡一样,但是没有嘲讽的意思不会的题,还会疯狂提示,一步步引导,硬要让我做出来总之体验很不错,但是感觉要挂了#面经##拼多多##服务端#
查看13道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
4
分享
牛客网
牛客企业服务