每日一题

89 阅读1分钟

一个数组,里面全是数字,从左至右的特征是从小到大,然后从大到小,数组中可能会出现连续重复的数字,请写一段代码《最快》找出数组中最大的数值,(最大值可能为1到多个),输出最大数字和个数 比如数组[1,3,3,3,4,5,6,7,8,8,8,8,8,9,10,10,11,11,12,23,23,33,33,10,2,2,2,2,2,2,1,1,1]

public class Test {
    //    private static int[] nums = new int[]{1,3,3,3,4,5,6,7,8,8,8,8,8,9,10,10,11,11,12,23,23,33,33,10,2,2,2,2,2,2,1,1,1};
    private static int[] nums = {9, 9, 9, 9, 9, 6, 6, 6, 2, 2, 2, 1};

    public static void main(String[] args) {
        sort(nums, 0, nums.length - 1);
    }

    public static void sort(int[] nums, int l, int r) {
        int m = (l + r) / 2;
        int i = 0;
        String s = find(nums, m);
        String[] s1 = s.split(" ");
        int ll = Integer.parseInt(s1[0]);
        int rr = Integer.parseInt(s1[1]);
        if(rr == nums.length -1 && ll == 0){
            System.out.println("最大值:" + rr + " " + ll);
            System.out.println("最大值:" + nums[rr] + " " + nums[ll]);
            System.out.println("总数" + ((rr - ll) + 1) * nums[rr]);
        }else if(rr == nums.length -1){
            System.out.println("最大值:" + rr + " " + ll);
            System.out.println("最大值:" + nums[rr] + " " + nums[ll]);
            System.out.println("总数" + ((rr - ll) + 1) * nums[rr]);
        }else if(ll == 0){
            System.out.println("最大值:" + rr + " " + ll);
            System.out.println("最大值:" + nums[rr] + " " + nums[ll]);
            System.out.println("总数" + ((rr - ll) + 1) * nums[rr]);
        }
        else{
            if (nums[rr + 1] < nums[rr] && nums[ll - 1] < nums[ll]) {
                System.out.println("最大值:" + rr + " " + ll);
                System.out.println("最大值:" + nums[rr] + " " + nums[ll]);
                System.out.println("总数" + ((rr - ll) + 1) * nums[rr]);
            }
            if (nums[rr + 1] > nums[rr] && nums[ll - 1] < nums[ll]) {
                sort(nums, rr, r);
            }
            if (nums[rr + 1] < nums[rr] && nums[ll - 1] > nums[ll]) {
                sort(nums, l, ll);
            }
        }


    }

    public static String find(int[] nums, int m) {
        int rr = m;
        int ll = m;
        boolean lflag = false;
        boolean rflag = false;
        while (true) {
            if (lflag && rflag) {
                break;
            }
            if (nums[rr] == nums[rr + 1]) {
                rr = rr + 1;
                if(rr >= nums.length-1){
                    rflag = true;
                }else{
                    if (nums[rr] != nums[rr + 1]) {
                        rflag = true;
                    }
                }
            } else {
                rflag = true;
            }
            if (nums[ll] == nums[ll - 1]) {
                ll = ll - 1;
                if(ll <= 0){
                    lflag = true;
                }else{
                    if (nums[ll] != nums[ll - 1]) {
                        lflag = true;
                    }
                }
            } else {
                lflag = true;
            }
        }
        System.out.println(nums[m] + " " + rr + " " + ll);
        return ll + " " + rr;
    }

}