需要解决的 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 训练任务