绝对不同的数字

时间:2016-01-21 20:23:45

标签: c++ arrays algorithm

我正在通过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/ 有一些错误,但我无法弄清楚它的细节,如果有人可以帮助我使用我的代码,我将非常感激!

谢谢!

3 个答案:

答案 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();