/*
* 写一个函数找出一个整数数组中,第二大的数(microsoft)
* 要求效率尽可能高
*/
#include<stdio.h>
#include<stdlib.h>
int find(int *a,int n)
{
int i=1;
int second=*(a+i);
while(i<n)
{
if(*(a+i)>second)second=*(a+i);
i++;
}
return second;
}
int findsecondmaxvalue(int *a,int n)
{
int i=0;
int first=*(a+i);
int second=*(a+i);
while(i<n)
{
if(*(a+i)>first)
{
second=first;
first=*(a+i);
}
else if(*(a+i)==first)
{
//do nothing
}
else if(*(a+i)<first&&*(a+i)>second)
{
second=*(a+i);
}
else
{
//do nothing
}
i++;
}
//最大值和次大值相等(只可能出现在数组的第一个元素)
if(first==second)
{
second=find(a,n);
}
return second;
}
int main()
{
int a[]={9,5,1,7,4,6,2,3,8};
int n=sizeof(a)/sizeof(a[0]);
int second=findsecondmaxvalue(a,n);
printf("次大值=%d\n",second);
}
* 写一个函数找出一个整数数组中,第二大的数(microsoft)
* 要求效率尽可能高
*/
#include<stdio.h>
#include<stdlib.h>
int find(int *a,int n)
{
int i=1;
int second=*(a+i);
while(i<n)
{
if(*(a+i)>second)second=*(a+i);
i++;
}
return second;
}
int findsecondmaxvalue(int *a,int n)
{
int i=0;
int first=*(a+i);
int second=*(a+i);
while(i<n)
{
if(*(a+i)>first)
{
second=first;
first=*(a+i);
}
else if(*(a+i)==first)
{
//do nothing
}
else if(*(a+i)<first&&*(a+i)>second)
{
second=*(a+i);
}
else
{
//do nothing
}
i++;
}
//最大值和次大值相等(只可能出现在数组的第一个元素)
if(first==second)
{
second=find(a,n);
}
return second;
}
int main()
{
int a[]={9,5,1,7,4,6,2,3,8};
int n=sizeof(a)/sizeof(a[0]);
int second=findsecondmaxvalue(a,n);
printf("次大值=%d\n",second);
}
C#写法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] ar = { 1, 2, 3, 4, 5, 6 };
try
{
Console.WriteLine(get2rdMax(ar).ToString());
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
Console.ReadKey();
}
private static int get2rdMax(int[] ar)
{
int max = ar[1], s_max = ar[1];
for (int i = 0; i < ar.Length; i++)
{
if (ar[i] > s_max)
{
s_max = ar[i];
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;
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] ar = { 1, 2, 3, 4, 5, 6 };
try
{
Console.WriteLine(get2rdMax(ar).ToString());
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
Console.ReadKey();
}
private static int get2rdMax(int[] ar)
{
int max = ar[1], s_max = ar[1];
for (int i = 0; i < ar.Length; i++)
{
if (ar[i] > s_max)
{
s_max = ar[i];
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;
}
}
}
C语言写法,改写C#的
#include <stdio.h>
int main(int argc, char *argv[])
{
int ar[7]={1,2,3,5,6,2,3};
int second=get2rdMax(ar,7);
printf("%d \n",second);
}
int get2rdMax(int *ar,int n)
{
int max=ar[1];
int s_max=ar[1];
int i;
for(i=0;i<n;i++)
{
if(ar[i]>s_max)
{
s_max=ar[i];
if(s_max>max)
{
int temp;
temp=s_max;
s_max=max;
max=temp;
}
}
}
if(max==s_max)
{
return 99999;
}
else
{
return s_max;
}
}
int main(int argc, char *argv[])
{
int ar[7]={1,2,3,5,6,2,3};
int second=get2rdMax(ar,7);
printf("%d \n",second);
}
int get2rdMax(int *ar,int n)
{
int max=ar[1];
int s_max=ar[1];
int i;
for(i=0;i<n;i++)
{
if(ar[i]>s_max)
{
s_max=ar[i];
if(s_max>max)
{
int temp;
temp=s_max;
s_max=max;
max=temp;
}
}
}
if(max==s_max)
{
return 99999;
}
else
{
return s_max;
}
}