需要解决的 Codility 测试

Posted

技术标签:

【中文标题】需要解决的 Codility 测试【英文标题】:A Codility test that needs to be solved 【发布时间】:2016-07-08 15:01:51 【问题描述】:

我看不懂这个问题,有人能解释一下吗?

更新:这是我使用 Kadane 算法的解决方案,但它在以下数组中失败:

Example test:    [-8, 3, 0, 5, -3, 12] 
WRONG ANSWER  (got 17 expected 12) 

Example test:    [-1, 2, 1, 2, 0, 2, 1, -3, 4, 3, 0, -1] 
WRONG ANSWER  (got 12 expected 8) 

int max_so_far = 0, max_ending_here = 0;

    for (int i = 0; i < A.size(); i++)
    
        max_ending_here = max_ending_here + A[i];
        if (max_ending_here < 0)
            max_ending_here = 0;
        if (max_so_far < max_ending_here)
            max_so_far = max_ending_here;
    
    return max_so_far;

【问题讨论】:

放弃作业并说“我不明白”并不是一个可以接受的问题。 @CodyGray 你能用清晰的英语向我解释一下吗,我不知道是切片(3,4)。从哪里得到它。 @andre 数组示例不正确,因为索引为 3 的元素不存在。:) 我假设非负切片代表切片的非负总和。然后你必须测试每个切片的总和才能找到最大值。 @Polux66 还是数组的非负元素? 【参考方案1】:

函数看起来就像演示程序中显示的那样

#include <iostream>
#include <algorithm>
#include <vector>

long long int solution( const std::vector<int> &v )

    long long int max_sum = 0;

    for ( auto it = v.begin(); 
         ( it = std::find_if( it, v.end(), []( int x )  return !( x < 0 );  ) ) != v.end(); 
        )
    
        long long int sum = 0;

        while ( it != v.end() && !( *it < 0 ) ) sum += *it++;

        if ( max_sum < sum ) max_sum = sum;
    

    return max_sum;
   


int main() 

    std::vector<int> v =  1, 2, -3, 4, 5, -6 ;

    std::cout << solution( v ) << std::endl;

    return 0;

它的输出是

9

您可以使用索引而不是迭代器来重写函数。

至于你的功能那么至少相对于这个条件是不正确的

    if (max_ending_here < 0)
        max_ending_here = 0;

因为条件不是检查当前元素是否小于零,而是检查当前元素的总和。

【讨论】:

我想知道我的算法中的错误,我使用的代码

以上是关于需要解决的 Codility 测试的主要内容,如果未能解决你的问题,请参考以下文章

Codility - CountDiv JavaScript解决方案

CountNonDivisible - Codility 训练任务

Codility峰的O(N * log(log(N)))算法?

java codility Max-Counters

关于 Codility 的 HilbertMaze 任务

FrogRiverOne-Codility Lesson4