Go语言实现:【剑指offer】数组中出现次数超过一半的数字

该题目来源于牛客网《剑指offer》专题。

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

Go语言实现:
方法一,排序取中间值判断:

func moreThanHalfNum(nums []int) int {
  if nums == nil {
    return 0
  }
​
  sort.Ints(nums)
  //如果条件符合,结果一定是中间这个数
  middle := nums[len(nums)/2]
  
  //判断条件是否成立
  count := 0
  for _,num := range nums {
    if num == middle {
      count ++
    }
  }if count>len(nums)/2 {
    return middle
  } else {
    return 0
  }
}

方法二,遍历一遍记次数判断:

func moreThanHalfNum(nums []int) int {
  if nums == nil {
    return 0
  }
​
  result := 0
  count := 0
  for index, num := range nums {
    if index == 0 {
      result = num
      count = 1
    } else {
      if result == num { //相等加一
        count ++
      } else { //不等减一
        count --
      }
      if count == 0 { //重新开始
        result = num
        count = 1
      }
    }
  }//判断条件是否成立
  count = 0
  for _, num := range nums {
    if num == result {
      count ++
    }
  }if count > len(nums)/2 {
    return result
  } else {
    return 0
  }
}
原文地址:https://www.cnblogs.com/dubinyang/p/12099405.html