虾皮 Shopee 9.23 笔试:单选多选 + 三道编程题
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 单选题(若干)
- 多选题(若干)
- 编程题一:三数之和,输出所有不重复的三元组,且三元组之间要按字符串升序排列
- 编程题二、编程题三:常规难度算法题
《参考解析》
三数之和的标准解法(排序 + 双指针 + 去重):先把数组排序,然后固定第一个数 nums[i],在它右边用左右指针找 nums[l] + nums[r] == -nums[i]:和偏小就 l++,偏大就 r--,相等就记录并把 l、r 都跳过重复值。去重有三个位置都要做:外层 i 如果和 nums[i-1] 相同直接跳过;命中之后 l 跳过相同值、r 也跳过相同值。一个小优化是 nums[i] > 0 时可以直接 break(排序后最小的数都大于 0,后面不可能凑出 0)。复杂度 O(n²) 时间、O(1) 额外空间(不算排序),这也是面试官期望的最优解,暴力 O(n³) 在 n 上千时必然超时。
「按字符串升序输出」到底在考什么:这题的难点不在算法而在输出格式。字符串升序比较的是字符编码,不是数值大小,所以实现上要先把每个三元组按题目要求的格式拼成字符串(例如 [-1,-1,2] 这种带方括号、逗号、有没有空格都要和样例逐字符对齐),再对字符串列表排序。负数会排在正数前面是因为 -(0x2D)小于所有数字字符;位数不同的数字也会错位,10 会排在 2 前面。两个容易踩的坑:①不要试图用「按数值排序再输出」去凑字符串序,两者结果不同;②格式化函数要唯一,别在排序时用一套拼接、输出时用另一套,否则排出来的顺序和实际打印的对不上。稳妥的做法是先把所有结果格式化成一个字符串列表,sorted() 一次,然后逐行打印,本地拿题目样例对一遍再提交。
平台报错不给信息时怎么自救:这种笔试平台等于没有反馈,必须把调试全部搬到本地。具体做法:①把输入解析、核心函数、输出打印三段拆开,本地写死题目样例跑通为止;②自造边界用例——空数组、长度不足 3、全 0、大量重复元素、无解、全正数 / 全负数,看会不会越界或死循环;③写一个 O(n³) 的暴力版本对拍随机小数据,确认结果集合一致(顺序另算);④核对输入格式的细节:是不是多组测试用例、有没有多余空格或空行、有没有要求输出组数,很多「本地过、提交 0 分」都是死在读入方式上;⑤时间来不及时的取舍是保住能拿分的题,先把三道题都读一遍、按把握程度排序做,别在一道格式题上耗掉整场。
单选 + 多选的备考方向:这类笔试的客观题基本是计算机基础的大杂烩——语言特性与代码输出题、数据结构与复杂度、操作系统(进程线程、死锁、内存管理)、计算机网络(TCP 状态机、HTTP、DNS)、数据库(SQL 语义、索引、事务隔离级别)以及少量概率与逻辑题。多选题因为「少选也不给分」最容易失分,答题时先把明显错误的选项排除,再对拿不准的选项看是否存在互斥关系,不要凭感觉凑数。客观题通常占总分不高但耗时可控,建议限时快速过一遍,把时间留给编程题。