我在腾讯一面碰到了这个问题,当时一看到就说想到了三种解法:
1.排序,快排复杂度O(nlogn);
2.暴力,两层循环复杂度O(n2);
3,定义初值最大值、最小值为首尾中偏大、偏小的值,(本来想用HashMap或者首尾指针分治)但其实一个循环就出来了,复杂度O(n);
//找出数组中第二大的数
public static int findSec(int[]arr){
if(arr==null||arr.length<=1)
throw new IllegalArgumentException("Illegal Array Exception.");
//定义最大值、次大值分别赋值首尾指针
int max,sec;
int lo=0,hi=arr.length-1;
if(arr[lo]>arr[hi]){
max=arr[lo];
sec=arr[hi];
}
else{
max=arr[hi];
sec=arr[lo];
}
int i=1;
for(;i<arr.length;i++){
if(max<arr[i])
max=arr[i];
else if(arr[i]>sec)
sec=arr[i];
}
return sec;
}
//测试方法
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr=new int[]{5,1,3,2,4};
int res=findSec(arr);
输出4
System.out.println(res);
}