ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

携程2026算法笔试真题解析与解题思路

携程2026算法笔试真题解析与解题思路 1. 携程2026算法笔试真题解析这套携程2026年春季校招算法笔试题呈现出明显的难度梯度从基础数学规律到经典算法模型都有涉及。作为参加过多次大厂笔试的老司机我发现这套题特别能考察候选人的思维敏捷度和算法基本功。2. 题目一纪念徽章尾号2.1 问题重述给定整数n求n!n的阶乘的末尾非零数字。例如输入5输出2因为5! 120末尾非零数字是22.2 解题思路这道题的关键在于发现阶乘尾数的数学规律当n≥5时阶乘必定包含因子10因为包含2和5的因子因此我们只需要计算去掉所有因子10后的最后一位即可2.3 具体实现def last_non_zero_digit(n): if n 5: # 预计算小数值 return [1,1,2,6,4][n] # 对于n≥5的情况结果只与n的个位数有关 last_digit n % 10 if last_digit 5: return (2 * last_non_zero_digit(n // 5) * last_non_zero_digit(n % 5)) % 10 else: return (4 * last_non_zero_digit(n // 5) * last_non_zero_digit(n % 5)) % 102.4 复杂度分析这个解法的时间复杂度是O(log n)因为每次递归都将问题规模缩小到1/5。注意实际笔试时可以直接用这个规律但要注意处理n0的特殊情况0!1。3. 题目二盲盒拆分计划3.1 问题描述给定一个正整数n将其拆分为若干个素数之和要求使用的素数个数尽可能多在满足条件1的情况下最大的素数尽可能小3.2 关键洞察经过数学分析可以发现为了使拆分数量最多应该尽可能使用小的素数数学上可以证明最优解只会使用2和3这两个最小的素数3.3 解题步骤当n1时无解当n2时[2]当n3时[3]当n≥4时如果n是偶数全拆分为2如果n是奇数拆分为一个3和若干个23.4 代码实现def prime_split(n): if n 1: return [] if n 2: return [2] if n 3: return [3] result [] if n % 2 1: result.append(3) n - 3 result [2] * (n // 2) return result3.5 复杂度分析这个解法的时间复杂度是O(1)因为只需要简单的数学运算即可得到结果。4. 题目三均衡货架切分4.1 问题描述给定一个正整数数组要求将其划分为若干连续子数组使得每个子数组的和相等。求最大可能的划分数。4.2 解题思路这道题的核心在于所有数都是正数所以前缀和严格递增总和必须能被划分数k整除每个子数组的和应该是total/k4.3 算法选择使用前缀和二分查找的方法计算数组的总和total枚举可能的k值从大到小对于每个k检查是否能将数组划分为k个和相等的子数组4.4 代码实现def max_equal_splits(arr): n len(arr) prefix [0] * (n 1) for i in range(n): prefix[i1] prefix[i] arr[i] total prefix[-1] max_k min(n, total) for k in range(max_k, 0, -1): if total % k ! 0: continue target total // k current 0 valid True for num in arr: current num if current target: current 0 elif current target: valid False break if valid and current 0: return k return 14.5 复杂度分析时间复杂度O(n^2) 最坏情况下需要检查所有可能的k值 空间复杂度O(n) 用于存储前缀和5. 题目四位运算最大值SOS DP5.1 问题描述给定一个数组nums对于每个元素nums[i]找到另一个元素nums[j]使得nums[i] XOR nums[j]最大。5.2 算法选择这是经典的SOS DPSum over Subsets DP问题用于高效处理位运算相关的最值问题。5.3 SOS DP原理预处理每个掩码mask对应的最大数对于每个数从高位到低位尝试翻转每一位看是否能得到更大的异或值5.4 代码实现def max_xor(nums): max_num max(nums) if max_num 0: return [0] * len(nums) L max_num.bit_length() max_xor 0 mask 0 for i in range(L-1, -1, -1): mask | 1 i prefixes {num mask for num in nums} temp max_xor | (1 i) for p in prefixes: if temp ^ p in prefixes: max_xor temp break result [] for num in nums: result.append(max_xor ^ num) return result5.5 复杂度分析时间复杂度O(n * L)其中L是数字的位数 空间复杂度O(n)6. 笔试经验分享6.1 时间分配建议前两题应该在15-20分钟内完成第三题建议分配25-30分钟最后一题可以留35-40分钟6.2 调试技巧对于数学规律题先手动计算小样例验证思路对于算法题先写出暴力解法再优化注意边界条件如n0,1等特殊情况6.3 常见错误没有处理特殊情况如空输入、极值等数学规律题没有充分验证就提交算法题的时间复杂度估计错误这套题目整体质量很高既考察了基础数学能力也检验了经典算法的掌握程度。建议平时多练习类似的题目培养快速识别问题模型的能力。
返回列表