采访 - 在数组中查找偶数和对

时间:2014-11-17 11:03:08

标签: c++ c arrays

给定一个数组,你如何返回总和为偶数的对的数量?

例如:

a[] = { 2 , -6 , 1, 3, 5 }

在这个数组中,与偶数和成对的nos是 (2,-6),(1,3),(1,5),(3,5)

函数应返回4,因为有4对,如果没有,则返回-1。

预期时间复杂度 - O(N)最坏情况 预期的空间复杂性 - O(N)最坏的情况

方法1: 蛮力

Start with the first number
  Start with second number
      assign the sum to a temp variable
      check if the temp is even
          If it is increment evenPair count
      else
          increment the second index

这里时间复杂度是O(N2)

5 个答案:

答案 0 :(得分:8)

int odd = 0, even = 0;
for (int i = 0; i < n; i++) {
    if (a[i] % 2 == 0) {
        even++;
    } else {
        odd++;
    }
}
int answer = (odd * (odd - 1) + even * (even - 1)) / 2;

答案 1 :(得分:2)

如果要使用标准算法,那么代码可以采用以下方式

#include <iostream>
#include <utility>
#include <numeric>
#include <iterator>

int main() 
{
    int a[] = { 2 , -6 , 1, 3, 5 };

    typedef size_t Odd, Even;
    auto p = std::accumulate( std::begin( a ), std::end( a ), 
                              std::pair<Odd, Even>( 0, 0 ),
                              []( std::pair<Odd, Even> &acc, int x )
                              {
                                return x & 1 ? ++acc.first : ++acc.second, acc;
                              } );

    std::cout << "There are " 
              << ( p.first * ( p.first - 1 ) + p.second * ( p.second - 1 ) ) / 2
              << " even sums" << std::endl;

    return 0;
}

输出

There are 4 even sums

考虑到n! / ( 2! * ( n - 2 )! )相当于( n - 1 ) * n / 2

使用标准算法的优点是您可以使用序列的任何子范围。您也可以使用标准流输入,因为std::accumulate使用输入迭代器。

如果在赋值的描述中,如果数组的元素之间没有偶数和,那么函数应该返回0而不是-1,这样会好得多。

虽然我建议从不在面试中做任何作业,但在面试中展示此代码并不可耻。面试不是考试。

答案 2 :(得分:2)

如果a和b是偶数,则a + b是偶数 如果它们是奇数,则a + b也是偶数 如果一个是奇数而一个是偶数,则a + b是奇数。

这意味着我们不需要执行任何添加,我们只需知道每种类型的数量。
找出这个需要线性时间。

如果您有k个数字,则有k-1对包含第一个数字,k-2包含第二个数字,依此类推。
使用熟悉的求和公式sum(1 .. n) = (n * (n + 1)) / 2

ne = number of even numbers
no = number of odd numbers

然后,

number of pairs = (ne-1) * ne / 2 + (no-1) * no / 2 
                = ((ne-1)*ne + (no-1)*no) / 2

该计算在恒定时间内运行,因此时间复杂度仍然是线性的。

我们只需要一定数量的额外空间,这比要求更好。


可能值得思考的可能的后续面试问题:

如果出现以下复杂情况(时间和空间)会发生什么:

  • 重复只计算一次,即{1,1,1,2}只有两个这样的对吗?
  • 我们忽略了顺序,即(1,2)(2,1)是“同一对”?

答案 3 :(得分:0)

另一种方法是用偶数和赔率计算和的数量,然后再求和

int sumO = 0 , sumE = 0 , numO = 0 , numE = 0;
for (int i=0; i < 5; i++)
{
    if (a[i] % 2 == 0)
    {
        sumE += numE;
        numE ++;
    }
    else
    {
        sumO += numO;
        numO ++;
    }
}

printf ("Total: %d\n", sumO + sumE);

答案 4 :(得分:0)

我从一次采访中得到了这个问题。 无需将偶数和奇数分开。

public static int evenTotalPairs(int[] A) {
int size = A.length;
int evens = 0;
for(int i = 0; i < size; i++ ){
    if(A[i] % 2 == 0){
        evens++;
    }
}
return evens*(evens-1)/2 + (size-evens)*(size-evens-1)/2;

}