我正在通过c ++写一篇关于codility的练习。这里的问题是:
给出了由N个数组成的非空零索引数组A.该 数组按非递减顺序排序。绝对鲜明的数量 这个数组的数量是不同绝对值的数量 数组的元素。
例如,考虑数组A:
A[0] = -5 A[1] = -3 A[2] = -1 A[3] = 0 A[4] = 3 A[5] = 6
此数组的绝对不同计数为5,因为此数组的元素中有5个不同的绝对值, 即0,1,3,5和6。
写一个函数:
int solution(vector<int> &A);
给定一个由N个数字组成的非空零索引数组A, 返回数组A的绝对不同计数。
例如,给定数组A使得:
A[0] = -5 A[1] = -3 A[2] = -1 A[3] = 0 A[4] = 3 A[5] = 6
该函数应返回5,如上所述。
假设:
N
是[1..100,000]
范围内的整数;
数组A
的每个元素 是[−2,147,483,648..2,147,483,647]
范围内的整数;
排列A
按非递减顺序排序。复杂度:
预期的最坏情况时间复杂度为
O(N);
预期的最坏情况空间 复杂度为O(N)
,超出了输入存储空间(不包括存储空间) 输入参数需要)。输入数组的元素可以是 修改。
我正在写下面的代码,我在代码中找不到任何问题,但它没有通过。
#include <algorithm>
#include <vector>
#include <cmath>
int solution(vector<int> &A) {
int N(A.size());
vector<long long> B(N,0);
int counter(1);
//int index(0);
int move1(0);
int move2(N-1);
if(N==1)
{return 1;}
if(N==0)
{return 0;}
if(N==2)
{
if(abs(A[0])==abs(A[1]))
{return 1;}
else{return 2;}
}
for (int i = 0 ; i < N ; ++i)
{
B[i]=abs((long long )A[i]);
}
while(move1<move2)
{
if(B[move1]==B[move1+1])
{move1+=1;}
else if(B[move2]==B[move2]-1)
{move2-=1;}
else if(B[move1]>B[move2])
{
counter+=1;
move1+=1;
}
else if(B[move1]<B[move2])
{
counter+=1;
move2-=1;
}
else{move1+=1;}
}
return counter;
}
以下是效果链接https://codility.com/demo/results/trainingUT9QAN-JMM/ 有一些错误,但我无法弄清楚它的细节,如果有人可以帮助我使用我的代码,我将非常感激!
谢谢!
答案 0 :(得分:0)
您可能想要一个迭代解决方案。从两端开始向内走向0。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
size_t solution( const std::vector< int > & A )
{
std::vector< int >::const_iterator f( A.begin() );
std::vector< int >::const_reverse_iterator b( A.rbegin() );
size_t result = 0;
if( A.size() )
for( ; ( f != A.end() ) && ( b != A.rend() ); )
{
if( *f >= 0 )
return result + ( ( A.end() - f ) - ( b - A.rbegin() ) );
else if( *b <= 0 )
return result + ( ( A.rend() - b ) - ( f - A.begin() ) );
else if( *f == -*b )
++result, ++f, ++b;
else if( *f > -*b )
++result, ++b;
else
++result, ++f;
}
return result;
}
int main( int, char ** )
{
std::cout << solution( std::vector< int >{ -5, -3, -1, 0, 3, 6} ) << std::endl;
std::cout << solution( std::vector< int >{ -5, -3, -1, 0, 1, 3, 6} ) << std::endl;
std::cout << solution( std::vector< int >{ -5, -3, -1, 0, 2, 3, 6} ) << std::endl;
std::cout << solution( std::vector< int >{ -5, -3, -1, 3, 6} ) << std::endl;
std::cout << solution( std::vector< int >{ -5, -3, -1, 0, 3, 4, 5} ) << std::endl;
return 0;
}
答案 1 :(得分:0)
使用Ruby的100%解决方案
def solution(a)
a.each_with_object({}){ |el, acc| acc[el.abs] = true }.size
end
答案 2 :(得分:0)
使用Java 8流获得100/100。
return (int) Arrays.stream(A).map(Math::abs)
.distinct().count();