shopee笔试 shopee笔试题 虾皮笔试 0825

笔试时间:2024年08月25日 秋招 题均为核心代码模型

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

第一题

题目

给定单链表头节点head,实现一个调整单链表的函数,使得每k个节点之间逆序,如果最后不够K个节点,则不进行调整。

样例输入

1,2,3,4,5,6,7,8,9,10,11,12,13,3

样例输出

3,2,1,6,5,4,9,8,7,12,11,10,13

参考题解

********

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

ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* dummy = new ListNode(0, head);
        ListNode* cur = dummy;
        while (true) {
        auto cur1 = cur;
            for (int i = 0; i < k && cur1; i++) {
                cur1 = cur1->next;
            }
            if (!cur1)
                break;
            auto a = cur->next, b = a->next;
            for (int i = 0; i < k - 1; i++) {
                auto c = b->next;
                b->next = a;
                a = b, b = c;
            }
            auto t = cur->next;
            cur->next->next = b;
            cur->next = a;
            cur = t;
        }
        return dummy->next;
    }

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

public class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0, head);
        ListNode cur = dummy;

        while (true) {
            ListNode cur1 = cur;
            for (int i = 0; i < k && cur1 != null; i++) {
                cur1 = cur1.next;
            }
            if (cur1 == null)
                break;

            ListNode a = cur.next, b = a.next;
            for (int i = 0; i < k - 1; i++) {
                ListNode c = b.next;
                b.next = a;
                a = b;
                b = c;
            }

            ListNode t = cur.next;
            cur.next.next = b;
            cur.next = a;
            cur = t;
        }
        
        return dummy.next;
    }
}

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

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        dummy = ListNode(0, head)
        cur = dummy

        while True:
            cur1 = cur
            for i in range(k):
                if not cur1:
                    break
                cur1 = cur1.next
            if not cur1:
                break

            a = cur.next
            b = a.next
            for i in range(k - 1):
                c = b.next
                b.next = a
                a = b
                b = c

            t = cur.next
            cur.next.next = b
            cur.next = a
            cur = t

        return dummy.next

第二题

题目

在两个数组中找出满足要求的两个数 详细描述 给定正整数X,两个正整数数组Arr1和Arr2,请在Arr1和Arr2中各找一个数,使得这两个数字之 和与X最接近,输出两个值对应的下标。

样例输入

[1,5,13,15],[10,11,17,20],20

样例输出

[0,3]

参考题解

对数组 Arr1 和 Arr2 分别进行排序,并保留它们的原始下标。使用双指针,一个指向 Arr1 的起始位置,另一个指向 Arr2 的末尾。计算当前两个指针所指向元素的和与目标值 X 的差距,并根据差距调整指针的移动方向。记录最小差距及其对应的下标。当两个指针相遇时,输出对应的下标。

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

vector<int> findClosetPair(vector<int>& arr1, vector<int>& arr2, int x) {
        int n1 = arr1.size();
        int n2 = arr2.size();
        
        // 存储原始下标的数组
        vector<pair<int, int>> arr1Indexed, arr2Indexed;
        
        for (int i = 0; i < n1; ++i) {
            arr1Indexed.push_back({arr1[i], i});
        }
        for (int i = 0; i < n2; ++i) {
            arr2Indexed.push_back({arr2[i], i});
        }
        
        // 对两个数组按值排序
        sort(arr1Indexed.begin(), arr1Indexed.end());
        sort

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

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

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

全部评论

相关推荐

专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
点赞 5 评论
分享
牛客网
牛客企业服务