[英]Interview - finding even sum pair in an array
给定一个数组,您将如何返回总和为偶数的对数?
例如:
a[] = { 2 , -6 , 1, 3, 5 }
在此数组中,与偶数和成对的no是(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)
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;
如果使用标准算法,则代码可以如下所示
#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! / ( 2! * ( n - 2 )! )
等于( n - 1 ) * n / 2
使用标准算法的优点是可以使用序列的任何子范围。 您也可以使用标准流输入,因为std::accumulate
使用输入迭代器。
如果在赋值的描述中写成如果数组元素之间没有偶数和,则函数应返回0而不是-1,那会更好。
尽管我建议不要在面试中做任何作业,但在面试中显示此代码并不可耻。 面试不是考试。
如果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)
是“相同”对吗? 一种不同的方法是按奇数和偶数计算和的数量,然后求和然后加在一起
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);
我从一次采访中得到了这个问题。 无需将偶数和奇数全部分开。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.