zoukankan      html  css  js  c++  java
  • 数组中出现次数超过一半的数字

    题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
     
    解析:方法一:这道题最low的解法是,用一个hashmap存起来,最后检查
     
    如果存在数量大于一半的数,那么依次选出两个不一样的删掉,最后剩下的数字肯定为那个大于一半的数字。
    方法二:从前向后遍历,每次遇到不是0的数字,就找他后面一个不是0的且与他不相等的数字,同时设置为0。最后找到一个不为0的,遍历一遍看这个数字出现的次数是不是大于一半,如果是就返回,不是就返回0
     
    方法三  把第一个数字作为参考 count为1,从他往后找,找到一个和他不一致的count-1,count为0时 则跳到下一个作参考,若一致则标志位count++,继续重复运行,最后的参考就是可能是的那个数字,再遍历一遍看 总数是否大于一半
     
    方法三十分巧妙,代码如下:
    public class Solution {
        public int MoreThanHalfNum_Solution(int [] array) {
            int length=array.length;
            if(array==null||length<=0){
                return 0;
            }
            
            int result=array[0];
            int times=1;
            for(int i=1;i<length;i++){
                if(times==0){
                    result=array[i];
                    times=1;
                }else{
                    if(array[i]==result){
                        times++;
                    }else{
                        times--;
                    }
                }
            }
            
            times=0;
            for(int i=0;i<length;i++){
                if(result==array[i]){
                    times++;
                }
           }
                
           if(times*2<length){
               result=0;
           }
           return result;
        }
    }
  • 相关阅读:
    SVN版本控制服务
    JVM内存结构
    Git的使用
    Nginx详解
    Apache(httpd)详解
    rsyslog日志收集器
    nsswitch名称解析框架
    NFS网络文件系统
    ThreadLocal详解
    RocketMQ踩坑记
  • 原文地址:https://www.cnblogs.com/tobemaster/p/5907791.html
Copyright © 2011-2022 走看看