首页 > 其他分享 >(三种方法)数组中出现次数超过一半的数字

(三种方法)数组中出现次数超过一半的数字

时间:2023-08-15 22:32:19浏览次数:33  
标签:return int 众数 len 次数 三种 numbers 数组 time

数组中出现次数超过一半的数字

方法1 HashMap

思想 :

利用HashMap计算每一次数组元素出现的次数,然后在判断这个数是不是众数(看有没有超过数组元素的一半)

代码实现:

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution (int[] numbers) {
        Scanner scanner = new Scanner(System.in);
        HashMap<Integer,Integer> map = new HashMap<>();
        int len = numbers.length;   
        for(int x : numbers) {
           map.put(x,map.getOrDefault(x,0)+1);
        }
        int max = 0;
         for(int x : numbers) {
                if(map.get(x) > len/2) {
                    max = x;
                }
         }
       return max; 
    }
    
}

方法2 排序

思想:

将数组进行排序,如果存在众数,说明中间的数就是众数 不存在返回0;

代码实现

public class Solution {
    public int MoreThanHalfNum_Solution (int[] numbers) {
        if(numbers == null || numbers.length == 0) {
            return 0;
        }
        Arrays.sort(numbers);
        int len = numbers.length;
        int midNum = numbers[len/2];
        int time = 0;
        for(int i = 0; i < len; i++) {
            if(numbers[i] == midNum) {
                time++;
            }
        }
        if(time > len/2) {
            return midNum;
        }
        return 0;
    }
}

方法3 消除(加分思路)

思想:

利用众数 和 非众数相互抵消 ,如果两个数不相等,就消除这两个数

如果众数存在,最后留下的数一定是众数

代码实现

import java.util.*;


public class Solution {
    public int MoreThanHalfNum_Solution (int[] numbers) {
        if(numbers == null || numbers.length == 0) {
            return 0;
        }
        int len = numbers.length;
        int res = numbers[0];
        int time = 1;
        //记录下标0的值,以及出现的次数1;
        //如果如果后面出值相同则次数加一,不同减一
        for(int i = 1; i < len; i++) {
            if(time != 0) {
                if(numbers[i] == res) {
                    time++;
                } else {
                    time--;
                }
              //time == 0 说明这个数出现次数被抵消完了,
              //将当前的下标元素赋值给res,次数重新计算
            } else {
                res = numbers[i];
                time = 1;
            }
        }
        int count = 0;
        for(int i = 0; i < len; i++) {
            if(numbers[i] == res) {
                count++;
            }
        }
       // 判断是不是众数
        if(count > len/2) {
            return res;
        }
        return 0;
    }
}

标签:return,int,众数,len,次数,三种,numbers,数组,time
From: https://blog.51cto.com/u_16166203/7094614

相关文章

  • 登录交换机的三种方式
    登录交换机主要有三种方法 一、使用Console线利用控制台通过串口进行本地连接登录,实现对设备的本地配置。console口登录认证有三种:无验证登录(none)、密码验证(password)、用户名和密码验证(scheme或AAA)常见终端仿真软件:Putty、SecureCRT、XShell等 二、利用辅助端口通过解调......
  • 2个数组删除
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>在一个数组中删除另一个数组存在的值</title><styletype="text/css">html,body{width:100%;height:100%......
  • C语言中数组的基础知识
    数组是一种集合数据类型,它由多个元素组成,每个元素都有相同的数据类型,占有相同大小的存储单元,且在内存中连续存放。每个数组有一个名字,数组中的每个元素有一个序号(称为下标),表示元素在数组中的位置,数组的维数和大小在定义数组时确定,程序运行时不能改变。一维数组的定义形式为:类型说......
  • Linux之脚本的函数数组
    目录一、shell函数1.1函数的定义二、数组三、冒泡一、shell函数将命令序列按格式写在一起可方便重复使用命令序列shell函数的定义调用函数的方法注意事项直接写函数中调用函数直接写函数名同名函数后一个生效调用函数一定要先定义只要先定义了调用的其他......
  • shell函数与数组
    目录shell函数与数组shell函数函数定义函数递归阶乘题目shell数组冒泡排序shell函数与数组shell函数函数定义将命令序列按格式写在一起可方便重复使用命令序列shell函数定义使用函数可以将大模块分割成小模块函数的组成:函数名、函数体[root@localhost~]#helpfuncti......
  • 力扣- 删除有序数组中的重复项
    给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改......
  • django中使用开启事务的三种方式
    django中使用开启事务的三种方式全局开启事务#settings.pyDATABASES={'default':{#全局开启事务,绑定的是http请求响应整个过程'ATOMIC_REQUESTS':True,}}#局部禁用fromdjango.dbimporttransaction#局......
  • Net7配置Autofac下IOC中的AOP,以及Autofac的三种生命周期写法
    Net7配置Autofac下IOC中的AOP是分两种,一种是基于接口的,一种是基于实现类的基于接口的好处是简单,但不能有效的控制具体到某个方法。也就是说,只能基于类来做操作,一个类下所有的方法都要接受注册基于实现类的是稍微麻烦一点,生效方法必须改为virtual,但可以实现到具体某个方法的效......
  • javascript 高级编程系列 - 定型数组
    定型数组是一种用于处理数值类型数据的专用数组,最早是在webGL中使用的,WebGL是OpenGLES2.0的移植版,在web页面中通过<canvas>元素来呈现它。定型数组也被一同移植而来,其可为javascript提供快速的按位运算。在javascript中,数字是以64位浮点格式储存的,并按需转换为32位整数,所以算术......
  • javascript 高级编程系列 - 数组
    1.Array.of创建数组constitems=Array.of(1,2,3);console.log(items);2.Array.from将可迭代对象或类数组对象转换为数组constitems=Array.from('123');console.log(items);3.Array.prototype.find&Array.prototype.findeIndex在数组中查找符合条件的第一......