剑指offer39:数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数字中出现了5次,超过数组长度的一般,因此输出2。
分析:可以在遍历数组的时候,保存两个值:一个是数组中的一个数字,另一个是次数。当遍历到下一个数字的时候,如果和保存的数字相同,那么次数+1,如果和保存的数字不同,那么次数-1,当次数减为0的时候,把当前值保存起来,并将次数设为1。如果这个出现次数超过数字长度一般的数字真的存在,那么最后保存的数字就是要找的值。go代码实现:
1 func majorityElement(nums []int) int { 2 //检查参数合法性 3 if len(nums) == 0 { 4 return 0 5 } 6 7 //记录数字和次数 8 num := nums[0] 9 times := 1 10 for i := 1; i < len(nums); i++ { 11 if num == nums[i] { 12 //当前数字和已经记录的数字相等,次数+1 13 times++ 14 } else { 15 //当前数字和已经记录的数字不相等,次数-1 16 times-- 17 if times == 0 { 18 //如果次数减为0了,就把记录的数字更新为当前数字,次数设为1 19 num = nums[i] 20 times++ 21 } 22 } 23 } 24 25 //检查一下这个数字是不是真的出现次数超过数组长度一半 26 if checkMoreThanHalf(nums, num) { 27 return num 28 } 29 30 return 0 31 } 32 33 func checkMoreThanHalf(nums []int, num int) bool { 34 var times int 35 //先统计下求的结果在数组中出现的次数 36 for i := 0; i < len(nums); i++ { 37 if nums[i] == num { 38 times++ 39 } 40 } 41 42 //校验看这个数出现的次数是不是超过了数组长度的一半 43 if times * 2 <= len(nums) { 44 return false 45 } 46 47 return true 48 }

浙公网安备 33010602011771号