JZ39 数组中出现次数超过一半的数字(牛客Java,三种方法)

描述

读入一个字符串str,输出字符串str中的连续最长的数字串

输入描述:

个测试输入包含1个测试用例,一个字符串str,长度不超过255。

输出描述:

在一行内输出str中里连续最长的数字串。

示例1

输入:

abcd12345ed125ss123456789

输出:

123456789

一.暴力解题法

思路

使用快排,将数组排序,取最中间的值一定是超过一半的那个值

    public int MoreThanHalfNum_Solution (int[] numbers) {
       Arrays.sort(numbers);
       return numbers[numbers.length/2];
    }

二.哈希表

思路

将数组的每个值作为key存入,每次存入value+1

一旦value超过数组长度的一半,则返回key

    public int MoreThanHalfNum_Solution (int[] numbers) {
        HashMap map = new HashMap<>();
        for(int i = 0 ; i < numbers.length ; i++){
            if(!map.containsKey(numbers[i])){
                map.put(numbers[i],1);
            }else{
                map.put(numbers[i],map.get(numbers[i])+1);
            }
            if(map.get(numbers[i]) > numbers.length/2){
                return numbers[i];
            }
        }
        return -1;
    }

三.阵地法

思路

我们将数组的首个元素设置为阵地1,如果遇到相同的元素则,计数器+1,遇到不同元素则计数器-1;

如果当计数器为0的时候,那么我们就切换到另一个人数多的新阵地

    public int MoreThanHalfNum_Solution (int[] numbers) {
        int zd1 = numbers[0];//第一个阵地
        int count =1;//目前存活人数
        for(int i = 1; i < numbers.length ; i++){
            if(zd1 == numbers[i]){//遇到相同元素的友军,存活人数+1
                count++;
            }else{
                count--;//遇到不同元素的敌军,存活人数-1
                if(count == 0){//如果存活人数为0,则投奔另一个阵地
                    zd1 = numbers[i];
                    count = 1;
                }
            }
        }
        return zd1;//返回存活人数最多的
    }

你可能感兴趣的:(java刷题,算法)