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

    题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
     

    思路:

    采用阵地攻守的思想:

    第一个数字作为第一个士兵,守阵地;count = 1;
    遇到相同元素,count++;


    遇到不相同元素,即为敌人,同归于尽,count--;

    当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。
    再加一次循环,记录这个士兵的个数看是否大于数组一般即可。

     

    代码:

     1 public class Solution {
     2     public int MoreThanHalfNum_Solution(int [] array) {
     3         if(array == null || array.length == 0){
     4             return 0;
     5         }
     6         int count = 0;
     7         int num = array[0];
     8         for(int i = 0;i< array.length; i++){
     9             //如果count==0,将下一个值赋给num
    10             if(count == 0 && (i+1)<array.length){
    11                 num = array[i+1];
    12             }
    13             //如果遇见相同的元素,count++
    14             if(num == array[i]){
    15                 count = count + 1;
    16             }else{    //如果遇见不相同的元素,count--
    17                 count = count - 1;
    18             }
    19         }
    20         //遍历num的个数
    21         int number =  0;
    22         for(int i = 0; i < array.length; i++){
    23             if(array[i] == num){
    24                 number++;
    25             }
    26         }
    27         //判断num的个数是否大于数组长度的一半
    28         if(number > array.length/2){
    29             return num;
    30         }else{
    31             return 0;
    32         }
    33     }
    34 }
  • 相关阅读:
    sql把字符数组转换成表 :把字符串1,2,3变成表里的行数据
    Excel中如何把时间转化成文本
    网页前段常用代码及网页自适应
    sql存储过程几个简单例子(一)
    Web调用安卓,苹果手机摄像头,本地图片和文件
    JQuery-方法
    JQuery-选择器
    AJAX-JSON
    Ajax-验证码
    DOM-XML(解析与创建)
  • 原文地址:https://www.cnblogs.com/maohaitao/p/11455916.html
Copyright © 2011-2022 走看看