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<Integer,Integer> 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;//返回存活人数最多的
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值