那位同学碰到新的算法题了。
去除A和B数组中的交集 ,即去除A和B数组中重复次数少的部分如A:111B:11,即去除B中的11
下面是我的解决方案,另希望他最后面试能过:
class
Program
{
static void Main( string [] args)
{
int [] ar = { 1 , 2 , 6 , 3 , 4 , 5 };
int [] ar2 = { 100 , 100 , 3 , 2 , 6 , 100 , 9 , 3 , 4 , 7 };
try
{
Console.WriteLine(get2rdMax(ar).ToString());
Console.WriteLine(get2rdMax(ar2).ToString());
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
}
private static int get2rdMax( int [] ar)
{
if (ar.Length < 2 )
throw new Exception( " no second max! " );
int max = ar[ 0 ], s_max = ar[ 0 ];
for ( int i = 1 ; i < ar.Length; i ++ )
{
int index = ar[i];
if (index == max)
continue ; // 重复值问题
if (s_max == ar[ 0 ] && max == ar[ 0 ])
{
s_max = index;
}
if (index > s_max)
{
s_max = index;
}
if (s_max > max)
{
max += s_max;
s_max = max - s_max;
max -= s_max;
}
}
if (max == s_max)
throw new Exception( " no second max! " );
else
return s_max;
}
{
static void Main( string [] args)
{
int [] ar = { 1 , 2 , 6 , 3 , 4 , 5 };
int [] ar2 = { 100 , 100 , 3 , 2 , 6 , 100 , 9 , 3 , 4 , 7 };
try
{
Console.WriteLine(get2rdMax(ar).ToString());
Console.WriteLine(get2rdMax(ar2).ToString());
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
}
private static int get2rdMax( int [] ar)
{
if (ar.Length < 2 )
throw new Exception( " no second max! " );
int max = ar[ 0 ], s_max = ar[ 0 ];
for ( int i = 1 ; i < ar.Length; i ++ )
{
int index = ar[i];
if (index == max)
continue ; // 重复值问题
if (s_max == ar[ 0 ] && max == ar[ 0 ])
{
s_max = index;
}
if (index > s_max)
{
s_max = index;
}
if (s_max > max)
{
max += s_max;
s_max = max - s_max;
max -= s_max;
}
}
if (max == s_max)
throw new Exception( " no second max! " );
else
return s_max;
}
}
本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2011/03/31/2001407.html,如需转载请自行联系原作者