【快手】真题-求连续子数组的最大和

求连续子数组的最大和

题目描述

一个非空整数数组,选择其中的两个位置,使得两个位置之间的数和最大。
如果最大的和为正数,则输出这个数;如果最大的和为负数或 0 ,则输出 0

数据范围: 1 ≤ n ≤ 10000 1≤n≤10000 1n10000 ,数组中的值满足 ∣ v a l ∣ ≤ 10000 ∣val∣≤10000 val∣≤10000

输入描述

3,-5,7,-2,8

输出描述

13

示例一

输入

-6,-9,-10

输出

0

说明

参考解题 C

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main()
{
    int sum=0,max=-2147483648,i,n;
    char num[10000];
    bool flag=true;
    while(scanf("%s",num)!=EOF)
    {
        for(i=0;i<strlen(num);i++)
        {
            if(num[i]==',')
                flag=true;
            if((('0'<num[i] && num[i]<'9')|| num[i]=='-')&&flag)
            {
                n=atoi(num+i);
                sum+=n;
                if(sum>max)
                    max=sum;
                if(sum<0)
                    sum=0;
                flag=false;
            }
        }
    }
    if(max<0)
        printf("%d",0);
    else
        printf("%d",max);
    return 0;
}

参考解题 C++

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int maxSum(vector<int>& nums) {
    if(nums.size() == 0) return 0;
    int res = 0, cur = 0;
    for(int n: nums)
    {
        cur = cur > 0? cur + n: n;
        if(cur > res) res = cur;
    }
    return res;
}
int main() {
    string s;
    while(cin >> s)
    {
        stringstream ss(s);
        vector<int>nums;
        int n;
        char c;
        ss >> n;
        nums.push_back(n);
        while(ss >> c >> n)
        {
            nums.push_back(n);
        }
        cout << maxSum(nums);
    }
    return 0;
    
}

参考解题 Java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.String;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while((str = br.readLine()) != null){
            String[] strArr = str.split(",");
            int[] arr = new int[strArr.length];
            for(int i = 0; i < arr.length; i++)
                arr[i] = Integer.parseInt(strArr[i]);
            System.out.println(maxSum(arr));
        }
    }
    
    private static int maxSum(int[] array) {
        if(array == null || array.length == 0) return 0;
        // 记录当前和
        int currentSum = 0;
        // 记录最后的和
        int finalSum = Integer.MIN_VALUE;
        for(int i = 0; i < array.length; i++){
            if(currentSum < 0)    // 当前和为负数时,重新计算当前和
                currentSum = array[i];
            else
                currentSum += array[i];
            if(finalSum < currentSum)
                finalSum = currentSum;
        }
        return finalSum >= 0 ? finalSum: 0;
    }
}

参考解题 Python


x = input()
arr = [int(val) for val in x.split(',')]
n = len(arr)
pre = arr[0]
ans = pre
for i in range(1, n):
    pre = max(pre + arr[i], arr[i])
    ans = max(ans, pre)
if ans < 0:
    ans = 0
print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosCloud2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值