阿里笔试 阿里灵犀笔试 0830

笔试时间:2025年8月30日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:最大子序列和

给定一个整数数组,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

样例输入

[-2, 1, -3, 4, -1, 2, 1, -5, 4]

样例输出

6

参考题解

维护两个量:cur:以当前元素结尾的子数组最大和,cur = max(x, cur + x)max:遍历到目前为止的全局最大和,max = max(max, cur)逐个元素更新上述两个量;当之前的累计和为负时,会自动“舍弃”,从当前元素重新开始。初始化 max 为首元素,cur 从 0 开始,保证全为负数时也能返回最大(最不小的)那个数。

C++:

#include <iostream>
#include <vector>
#include <algorithm>  // 用于 std::max

using namespace std;

// 计算最大子数组和(Kadane算法)
int maxSubArray(vector<int>& nums) {
    // 处理边界:若数组为空(原Java未处理,此处可选增强鲁棒性)
    if (nums.empty()) {
        return 0;  // 或抛出异常,根据需求调整
    }
    
    // 初始化全局最大值为数组第一个元素,当前子数组和为0
    int max_sum = nums[0];
    int current_sum = 0;
    
    // 遍历数组每个元素
    for (int x : nums) {
        // 关键逻辑:要么从当前元素重新开始,要么继续累加当前子数组
        current_sum = max(x, current_sum + x);
        // 更新全局最大值
        max_sum = max(max_sum, current_sum);
    }
    
    return max_sum;
}

// 测试示例(可选)
int main() {
    vector<int> test_nums1 = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    cout << maxSubArray(test_nums1) << endl;  // 输出:6
    
    vector<int> test_nums2 = {1};
    cout << maxSubArray(test_nums2) << endl;  // 输出:1
    
    vector<int> test_nums3 = {5, 4, -1, 7, 8};
    cout << maxSubArray(test_nums3) << endl;  // 输出:23
    
    return 0;
}

Java:

import java.util.*;

public class Solution {
    public int maxSubArray (int[] nums) {
        int max = nums[0];
        int cur = 0;
        for (int x : nums) {
            cur = Math.max(x, cur + x);
            max = Math.max(max, cur);
        }
        return max;
    }
}

Python:

def max_sub_array(nums):
    # 处理边界:若数组为空(按原Java逻辑默认nums非空,此处可加判断增强鲁棒性)
    if not nums:
        return 0  # 或根据需求抛出异常,原Java未处理空数组,此处可选
    
    # 初始化全局最大值为数组第一个元素,当前子数组和为0
    max_sum = nums[0]
    current_sum = 0
    
    # 遍历数组每个元素
    for x in nums:
        # 关键逻辑:要么从当前元素重新开始累加,要么继续累加当前子数组
        current_sum = max(x, current_sum + x)
        # 更新全局最大值
        max_sum = max(max_sum, current_sum)
    
    return max_sum


# 测试示例(可选)
if __name__ == "__main__":
    test_nums1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

点赞 评论 收藏
分享
包行:平时怎么刷算法题的哇,字节的手撕听说都很难
字节跳动工作体验
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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