1、请写一个功能性的函数,输入一个数组,返回这个数组中第二大的数字。要求:只能用一个for循环实现,不能做排序。例如:输入的数组内容是 [3, -1, 2, 8, 4, 1] 返回 4

    public static int sort(int[] nums) {
        if (nums.length < 0) {
            return 0;
        }
        if (nums.length == 1) {
            return nums[0];
        }
        int tmp,first=nums[0],second=nums[1];
        if (first > second) {
            tmp = second;
            second = first;
            first = tmp;
        }
        for (int i = 2; i < nums.length; i++) {
            if (first > nums[i])
                continue;
            else {
                first = nums[i];
            }
            if (first > second) {
                tmp = second;
                second = first;
                first = tmp;
            }
        }
        return first;
    }

  时间复杂度是O(n)

1.1 额外问题:如果不考虑上述要求的限制,要高效的从给定数组中找出第m大的数字,应该怎样做?数组内容和m都是外部输入的。函数的功能是返回数组中第m大的数字。

  如果m的值比较小或者接近数组的长度,那么使用上面的方法实现比较合适。既然又强调了说明一下,估计是考快速排序的算法。思路如下:取第m个数字进行快排,比它大的放到左边,小的放在右边,然后看m的位置i,如果i小于m,那么在m的右边重复查找第m-i大的数字,循环一直到结束。

package com.taobao;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] nums = { 3, -1, 2, 8, 4, 1 };
        // System.out.println(Test.sort(nums));
        for(int i=1; i<=nums.length; i++)
        {
            System.out.println(Test.getMax(nums, i));
        }
    }

    /**
     * 获取数组中第几大的数字
     * 
     * @param nums
     * @param index
     * @return
     */
    public static int getMax(int[] nums, int index) {
        if(index<1||index>nums.length){
            return 0;
        }
        int i = 0, j = 0;// 数组下标
        int compare = 0, tmp = 0;// 对比值
        while (true) {
            // 对比数值
            j = nums.length - 1;
            compare = nums[index - 1];
            for (i = 0; i < j; i++) {
                if (nums[i] <= compare) {
                    // 比较替换
                    for (; j > i; j--) {
                        if (nums[j] >= compare) {
                            tmp = nums[i];
                            nums[i] = nums[j];
                            nums[j] = tmp;
                            j--;
                            break;
                        }
                    }
                }
            }
            
            if ((i+1) == index) {
                // 找到了
                break;
            } else if (i >= index) {
                // 继续查找
                if (i==j){
                    nums = Arrays.copyOfRange(nums, 0, i+1);
                }else{
                    nums = Arrays.copyOfRange(nums, 0, i);
                }
            } else {
                // 反方向查找
                int length = nums.length;
                nums = Arrays.copyOfRange(nums, i, length);
                index = index - i;
            }
        }
        return nums[index - 1];
    }
}